- 以前在回答这个问题的时候都是东一句西一句,今天把它整理一下,等下一次面试好用
- 优化方式从复杂度和成本等因素,从高到低排列
一、优化步骤
- 优化sql和索引
- 加缓存 redis
- 做主从复制或主主复制,读写分离
- 做垂直拆分,把不常查的字段和查询频率高的字段分离开
- 水平拆分,通过用ID取余的方法把数据分散到多张表里面 例: Id%4+1 = [1,2,3,4]
优化索引
- 在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
- 建立索引的列,不允许为null,否则将导致引擎放弃使用索引而进行全表扫描
- 不用外键,由程序约束
- 字符字段最好不要做主键
- 数据类型出现隐式转换的时候不会命中索引,特别是当列类型是字符串,一定要将字符常量值用引号引起来。
优化sql
- 使用limit对查询结果的记录进行限定
- 避免select *,将需要查找的字段列出来
- 使用连接(join)来代替子查询
- 可通过开启慢查询日志来找出较慢的SQL
- 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等
- sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库
- OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内
- 不用函数和触发器,在应用程序实现
- 避免在like查询的前面使用通配符, 避免%xxx式查询
- 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 对于连续数值,使用BETWEEN AND不用IN
网友评论