MySQL高级知识:索引
最近在看MySQL的高级部分知识的东西.先写点关于索引的知识总结吧,
因为前段时间把公司正式服务器上的慢SQL都分析了一遍,进行统一的优化,数据库的压力有了明显的降低.性能更加的稳健了.一老一个查询10-30秒的真心收不了啊.
索引嘛,就是一种有序的数据结构,主要是用在查询和排序方面.对于提高查询和排序的速度很有帮助.
从我实际上使用的基本全部都是BTree索引,都是建立的这种索引,只有少数两三个表中的字段建立的是Hash索引.其他的基本上没用过,像full-text,R-BTree.
BTree索引其实就是B+树,Hash所以就是值对应的Hash值了.
总结一下该建立索引的地方:
1.主键唯一索引
2.频繁作为查询条件的列
3.外键关系
4.组合查询用的列,建立多列索引
5.常用来排序的字段
6.统计/分组的字段
不该建立索引的有:
1.数据量都没有超过300行的
2.常增删的字段
3.数据重复且分布比较均匀的列(假设有2000条数据,其中有1980个不同的值,1980/2000=0.99,得到的结果越是接近1越好)
Explain yourSQL在进行sql的分析的时候用的频繁
下面重点说下其中的关键的几个列的解释:
1.id 主要用来查看先查的哪张表的
2.type 访问类型,显示是怎么查询的,全表扫描还是使用索引查询到的
按照结果的好坏排序是:
system>const>eq-ref>ref>range>index>All
就我们而言,最好的是在ref级别,我们一般写的SQL至少也要达到range 级别.尽量避免出现All(全表扫描)的情况
eq-ref:是全表唯一索引
ref:是非唯一性索引,返回单独值所有行
range:是只检索给定范围的行
index:是只遍历索引树(也是全表)
3.keys:实际在搜索的时候用到的索引
4.rows:根据条件找到结果大致的检索的行数,当然越少越好了
5.Extra:其他的一些信息的显示,如using index:使用到了索引,效率蛮好的,多在order by中的出现;
using filesort:无法使用索引完成排序,效率堪忧啊.
using temporary:用到的临时表,,效率堪忧啊.
在建立的索引的时候,看实际情况,也不是一次就能建好的,还要经过多次测试,查看,分析,反复进行.
补充一句,很多时候,多列索引优于单列索引,但不绝对.
说下like检索时候的怎么使用索引吧.
我们有表user,在name,age上面建立多列索引
我们都知道select name,age from user where name like '%zhaojun%' 这种情况是使用了覆盖索引来进行查询效率的提升,比单纯的在在name