美文网首页
MySQL 对于千万级的大表优化

MySQL 对于千万级的大表优化

作者: 骑代码奔小康 | 来源:发表于2020-06-18 14:08 被阅读0次
  • 以前在回答这个问题的时候都是东一句西一句,今天把它整理一下,等下一次面试好用
  • 优化方式从复杂度和成本等因素,从高到低排列

一、优化步骤

  1. 优化sql和索引
  2. 加缓存 redis
  3. 做主从复制或主主复制,读写分离
  4. 做垂直拆分,把不常查的字段和查询频率高的字段分离开
  5. 水平拆分,通过用ID取余的方法把数据分散到多张表里面 例: Id%4+1 = [1,2,3,4]

优化索引

  1. 在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
  2. 建立索引的列,不允许为null,否则将导致引擎放弃使用索引而进行全表扫描
  3. 不用外键,由程序约束
  4. 字符字段最好不要做主键
  5. 数据类型出现隐式转换的时候不会命中索引,特别是当列类型是字符串,一定要将字符常量值用引号引起来。

优化sql

  1. 使用limit对查询结果的记录进行限定
  2. 避免select *,将需要查找的字段列出来
  3. 使用连接(join)来代替子查询
  4. 可通过开启慢查询日志来找出较慢的SQL
  5. 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等
  6. sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库
  7. OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内
  8. 不用函数和触发器,在应用程序实现
  9. 避免在like查询的前面使用通配符, 避免%xxx式查询
  10. 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  11. 对于连续数值,使用BETWEEN AND不用IN

相关文章

网友评论

      本文标题:MySQL 对于千万级的大表优化

      本文链接:https://www.haomeiwen.com/subject/qbcztktx.html