2020-11-08

Mysql慢查询优化必知


explain SELECT * FROM dzx_forum_thread WHERE fid IN (15) AND displayorder = 0 ORDER BY lastpost DESC LIMIT 20;


Extra 里面出现 Using filesort 表示索引需要优化

索引一次只能用一个


索引优化注意事项:


哪些常见情况不能用索引?

  • like “%xxx”
  • not in , !=
  • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
  • WHERE index=1 OR A=10
  • 存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系



什么样的字段不适合建索引?

  • 一般来说,列的值唯一性太小(如性别,类型什么的),不适合建索引(怎样叫太小?一半说来,同值的数据超过表的百分之15,那就没必要建索引了)
  • 太长的列,可以选择只建立部分索引,(如:只取前十位做索引)
  • 更新非常频繁的数据不适宜建索引(怎样叫非常?意会)


联合索引的问题?

where a = “xxx” 可以使用 AB 联合索引

where b = “xxx” 则不可 (再想象一下,这是书的目录?)

所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了


索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *


NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?)


来自: mysql索引需要了解的几个注意