Skip to content

数据库优化

L edited this page Aug 17, 2020 · 7 revisions

使用索引

善用索引,读取数据创建索引、写入数据删除索引
即写入数据之前,先删除索引,写完之后再创建索引
参考资料:
sql索引优化-force index

减少查询接口的次数、减少查询的字段数

分页查询

调整数据结构

使用缓存数据库、开启查询缓存

巧用存储过程

优化SQL语句

	当只要一行数据时使用 LIMIT 1         
	避免 SELECT *    每次select * 都会查一次系统表,先查表结构,再查值            
	永远为每张表设置一个ID             
	使用 ENUM 而不是 VARCHAR           
	拆分大的 DELETE 或 INSERT 语句           
	越小的列会越快             
	尽可能的使用 NOT NULL          
	从 PROCEDURE ANALYSE() 取得建议           
	EXPLAIN 你的 SELECT 查询           
	千万不要 ORDER BY RAND()     

查找数据尽可能依赖带索引的数据结构

固定长度的表会更快

垂直分割

选择正确的存储引擎

使用一个对象关系映射器(Object Relational Mapper)

小心“永久链接”

使用事务

业务优化

分析业务逻辑,优化业务处理步骤

并行

串行数据性能发挥至极致,可以引入并行。根据情况,考虑并行读、并行写
并行引起的并发问题尽量通过分区和复制进行规避
并行处理数据的时候可能有并发冲突,比如订单数据处理,下单->支付->妥投各种订单环节的计算实际上有很大数据冲突,这个要处理一般就是加锁什么的
但是你可以做一下分区,同一个订单相关的数据hash到固定线程处理,比如对订单尾号取模,这样就可以用单线程思路处理多线程问题,只要分区策略是均匀的

使用批处理

使用批处理替代循环处理,降低io
eg.有一堆集合要从redis取数据,循环调用get命令比使用mget一次取多个key,低了一个数量级
假设redis 网络延返 1ms,那10次get调用,10ms 一个mget,只需一次网络延返,只需要1ms,不考虑redis内部的计算

参考资料

数据库性能优化详解
MYSQL性能优化的最佳20+条经验

Clone this wiki locally