[关闭]
@dungan 2020-08-08T09:53:58.000000Z 字数 1772 阅读 67

mysql 优化

Mysql


sSql 优化

  1. 1、大的sql想办法拆成小的sql语句:充分利用QUERY CACHE和充分利用多核CPU
  2. 2、如果明确知道只有一条结果返回,limit 1能够提高效率: select * from user where test=? limit 1
  3. 3limit分页注意效率:Limit越大,效率越低。可以改写limit select id from table limit 10000, 10; 优化为 select id from t where id > 10000 limit 10;
  4. 4、前导模糊查询不能使用索引:select * from order where desc like '%XX' ,可优化为非前导模糊查询 select * from order where desc like 'XX%'
  5. 5sql中使用到OR的改写为用 IN() ,因为or的效率没有in的效率高。
  6. 6、把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果,select * from order where date<=CURDATE() 优化为 select * from order where date<=$date
  7. 7、在属性上进行计算不能命中索引:select * from order where YEAR(ctime) <= '2017';可优化为 select * from order where ctime <= $date
  8. 8、强制类型转换不会使用索引,会全表扫描 : select * from user where phone=13800001234,因为表中phone的类型为varchar,但这里当成数字来查询,可优化为 select * from user where phone='13800001234'
  9. 9、负向条件查询不能使用索引:select * from order where type !=0, not in/not exists 都不是好习惯,可优化为 in 查询 select * from order where type in (1,2)。
  10. 10、复合索引最左前缀:例如建立了(name, passwd)的复合索引,select * from user where passwd=? 不能命中索引,因为passwd在右边,不满足复合索引最左前缀,但是 select * from user where name=? select * from user where name=?,passwd=?;select * from user where passwd=?,name=? 却能命中索引。
  11. 10、禁止大表使用JOIN查询,禁止大表使用子查询 : 因为会产生临时表,消耗较多内存与CPU ,极大影响数据库性能
  12. ,应用程序必须捕获SQL异常,并有相应处理,一般使用php的错误捕获和异常捕获机制。

索引优化

  1. 1、多条字段重复的语句,为其建立一条组合索引,减少索引数量
  2. 2、建组合索引的时候,区分度最高的在最左边。 如果where a=? and b=?,a列的几乎接近于唯一值, 那么只需要单建idx_a索引即可。
  3. 3、单表索引建议控制在5个以内;单索引字段数不允许超过5个,一般字段超过5个时,实际已经起不到有效过滤数据的作用了
  4. 4、能使用唯一索引就要使用唯一索引(hash,b-tree,normal),提高查询效率,新建的唯一索引必须不能和主键重复
  5. 5、选择离散度大的字段建立索引,离散度=count(distinct field),对于电话和性别,明显在电话上建立索引要好过性别;组合索引必须把离散度高的字段放在前面,这样能够更加有效的过滤数据
  6. 6、如果业务大部分是单条查询,使用Hash索引性能更好,如获取用户select * from user where uid=? B-Tree索引的时间复杂度是O(log(n)),Hash索引的时间复杂度是O(1)
  7. 7、哪些字段适合建立索引:【定长的字段(如char类型),where字句中的查询条件,两个表的关联字段,分组字段,排序字段适合建立索引】注意:索引会占用磁盘空间,并且会降低添加、删除和更新行的速度

查询缓存

表结构优化

服务器配置优化

参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注