后端主流数据库分析

打印 上一主题 下一主题

主题 953|帖子 953|积分 2859

一、关系型数据库(RDBMS)

1. MySQL:金融支付系统焦点

行业场景:​


  • 金融支付:银行交易流水、支付订单(ACID事件保障)。
  • ​电商平台:商品库存管理、订单状态跟踪(高并发OLTP)。
  • SaaS服务:多租户用户管理(分库分表隔离数据)。
Python实战代码
  1. # 金融交易事务操作(原子性保障)
  2. import pymysql
  3. from contextlib import contextmanager
  4. @contextmanager
  5. def mysql_transaction():
  6.     conn = pymysql.connect(host='localhost', user='root', password='******', db='******')
  7.     try:
  8.         with conn.cursor() as cursor:
  9.             yield cursor
  10.             conn.commit()  # 事务提交
  11.     except Exception as e:
  12.         conn.rollback()    # 事务回滚
  13.         raise e
  14.     finally:
  15.         conn.close()
  16. # 使用示例:转账操作
  17. def transfer_money(from_account, to_account, amount):
  18.     with mysql_transaction() as cursor:
  19.         # 扣除转出账户
  20.         cursor.execute("UPDATE accounts SET balance = balance - %s WHERE id = %s", (amount, from_account))
  21.         # 增加转入账户
  22.         cursor.execute("UPDATE accounts SET balance = balance + %s WHERE id = %s", (amount, to_account))
  23.         # 记录交易流水
  24.         cursor.execute("INSERT INTO transactions (from_id, to_id, amount) VALUES (%s, %s, %s)",
  25.                       (from_account, to_account, amount))
  26. # 调用:从账户1转100元到账户2
  27. transfer_money(1, 2, 100)
复制代码
性能本领


  • 利用毗连池(如DBUtils.PooledDB)制止频仍创建毗连
  • 对account_id和transaction_time字段创建联合索引加快查询
​性能优化


  • 索引设计:制止全表扫描,对高频查询字段(如user_id)建B+树索引。
  • 读写分离:用ProxySQL或MaxScale分离读写流量,主库写,从库读。​
灾难规复


  • 每日全量备份 + Binlog 增量备份,通过 mysqldump 或 Percona XtraBackup 实现。
  • 快速规复:mysqlbinlog 重放 Binlog 到指定时间点。
<hr> 2. PostgreSQL:地理信息分析系统

行业场景


  • ​地理信息(GIS)​:物流路径规划(PostGIS扩展支持空间数据)。
  • 科研盘算:基因序列分析(数组范例和PL/Python扩展)。
  • 金融风控:复杂SQL分析(窗口函数盘算用户行为聚合)。
Python实战代码
  1. # 使用PostGIS计算两个坐标距离
  2. import psycopg2
  3. from geoalchemy2 import WKTElement
  4. from sqlalchemy import create_engine
  5. # 创建空间数据表
  6. engine = create_engine('postgresql+psycopg2://user:pass@localhost/gis_db')
  7. with engine.connect() as conn:
  8.     conn.execute("""
  9.         CREATE TABLE IF NOT EXISTS warehouses (
  10.             id SERIAL PRIMARY KEY,
  11.             name VARCHAR(100),
  12.             location GEOGRAPHY(Point)
  13.         )
  14.     """)
  15. # 插入坐标点(北京首都机场)
  16. point = WKTElement('POINT(*.*.*.*)', srid=4326)
  17. insert_sql = "INSERT INTO warehouses (name, location) VALUES (%s, %s)"
  18. with engine.connect() as conn:
  19.     conn.execute(insert_sql, ('Beijing Airport', point))
  20. # 查询距离某点50公里内的仓库
  21. query = """
  22.     SELECT name, ST_Distance(location, ST_GeogFromText('POINT(*.*.*.*)')) as distance
  23.     FROM warehouses
  24.     WHERE ST_DWithin(location, ST_GeogFromText('POINT(*.*.*.*)'), 50000)
  25. """
  26. result = engine.execute(query)
  27. for row in result:
  28.     print(f"{
  29.      row.name} 距离天安门 {
  30.      row.distance:.2f
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表