一. 优化军规20条:
1.where 查询条件,类型要一致,避免类型转换,非常慢
2.查询条件包含函数,负向查找,导致大表,多表联合查询奇慢
3.in子查询超时,将子查询in 改造为临时表或表值参数后join
4.尽量不在数据库做运算,复杂运算转移到程序端CPU计算,尽量简单使用mysql
5.控制单表数据量,int型不超过1000万行,
6.控制单库不超过300个表
7.控制表字段数少儿精,单行不超过200byte,单表不超过30个Int,20个char(10)
8.拒绝大sql,大事务,大批量
9.将字符转为数字:更高效,查询更快,占用空间更小
10.避免使用null字段:都给默认值,否则加索引需额外空间,查询不走索引
11.不用大字段类型text/blob,可以查分到单独的表或mongodb
12.用自增和int作为innodb的主键
13.1个sql只能在一个cpu运算,高并发中大sql可能把整个数据库拖死,需化解为多个简单sql在多cpu运算,减少锁表时间
14.避免%前缀模糊查询,使用不了所有,全表扫描
15.select * from table limit 10000,10 偏移量越大越慢,推进分页:select * from table where id>10000 limit 11
16.高级分页方式:select * from table where id>=(select id f from table limit 1000,1) limit 10;
17.常用命令:explain,show profile,show slow log,show processlist,show query_response_time(percona)
18.统一字符集:utf8
19.校对规则:utf8_general_ci
20.库,表名称统一用小写字母,索引命名默认为idx_字段名
二. mysql优化demo:
大表,多表,多列联查,部分字段没有使用到索引,回主表查询导致整个查询慢的解决方案 (此类问题已解决,记录到这里做记录,类似问题可以参考这样处理)
1.根据查询的列来自不同的表,注释字段排除,看看慢的原因是查询那个表的字段;
2.定位到查询慢的表后,查看执行计划,分析此表的执行计划是否有用到索引,用的那个索引,索引是否包含要查询的字段,若没有可以添加包含字段;
3.如此一 一检查每个表查询慢的字段,到最终解决查询慢的原因。