欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL高级知识:索引

程序员文章站 2022-03-23 09:36:54
最近在看MySQL的高级部分知识的东西.先写点关于索引的知识总结吧, 因为前段时间把公司正式服务器上的慢SQL都分析了一遍,进行统一的优化,数据库的压力有了明显的降低.性能更加的...

最近在看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