1.首先看表的数据量级以及sql数据涉及的业务含义
A.数据量超2000万,大概率优化空间不大
B.数据量级小的情况下,需看查询sql是否合理
2.看表是否建立合适的索引
A.针对高频查询的字段建立索引
B.当查询涉及多列组合条件时(如 WHERE a=1 AND b=2),使用联合索引(CREATE INDEX idx ON t(a,b)),并遵循最左前缀原则,优先将区分度高、长度小的字段放在左侧
3.用explain看查询计划,看索引是否失效
A.LIKE模糊查询:通配符 % 在前(如 LIKE ‘%apple%’)会导致索引失效,应尽量写成 LIKE ‘apple%’
B.OR条件:确保 OR 两侧的字段均有索引,否则触发全表扫描
C.隐式类型转换:例如字符串字段与数值比较(WHERE phone=123456)会导致索引失效
D.查询字段里使用了函数,但是我记得mysql最新版本里新增了函数索引,可以针对表建立函数索引,这样查询时即使带上了函数;也会根据函数后的值的索引来进行查询
4.sql语句方面的优化
A.避免使用select *,尽量使用select字段名,这样查询出的字段数少,减少内存开销,提高性能
B.只查必要字段,非必要字段可以放到代码逻辑里组装
C.尽量避免使用子查询,子查询会新增临时表增加内存开销,影响性能;看是否能改成join查询
D.进行子查询时尽量使用主键来关联,用id来作为in或者关联条件,减少回表
E.left join时,右表的字段尽量有索引;join是两边表字段最好都有索引
F.join查询最好用小表作为驱动表
G.使用dinstict 而非group by来去重
H.能使用union all时不使用union
5.字段方面的优化
A.使用int而非varchar存储数据
B.尽量不使用大字段,如text、blob等
6.业务层面
A.如果是报表数据实时性要求不高的,可以使用定时任务跑出报表数据,避免实时统计汇总计算
B.如果数据量太大,可以使用分库分表
C.关键且数据量不大的数据,看是否可以换其他的存储方式,如redis、memcache等
D.考虑其他的存储引擎,例如es这种文本检索工具