mysql-影响MySQL索引的因素

一.MySQL索引
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
MySQL5.5之前的版本,默认的存储引擎是MyISAM,5.5以后默认的存储引擎是InnoDB。存储引擎是由第三方公司提供的一个插拔式的插件(是每个公司都要实现的一套标准)的方式来使用的。存储引擎都是定义到表结构上面的,可以在一个库里面定义多种存储引擎,每个表可以使用不同的存储引擎。索引机制就是由这些插拔式的存储引擎来实现的。
MySQL调优是一个系统工程,包括很多方面,而索引是非常重要非常基础的一个环节。正确的创建合适的索引是提升数据库查询性能的基础。
二.使用索引的好处:
1.关系型数据库的索引一般都是硬盘级的索引,比如,一个十几个字段的表,2000万数据的表,他的索引占用内存就可以达到1-2G,所以把所有的索引放到内存中是很不现实的,而使用索引能极大的减少存储引擎需要扫描的数据量;
2.索引可以把随机IO变成顺序IO;
3.索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。
三。MySQL数据存储的顺序:
数据库表行中数据的物理顺序与键值的逻辑(索引) 顺序相同,可以认为InnoDB是以聚集索引来组织数据的存储的。在叶子节点中存储了所有的数据信息。
MySQL里面除了主键索引,其他的都是非聚集索引。
四。辅助索引
辅助索引在叶子节点保存了主键索引的值,如果用辅助索引查找,他会一直查找到主键索引的值,然后再基于主键索引去查找叶子节点的所有数据。这样设计的目的是,InnoDB认为主键是最常用的查询条件,所以他把所有的数据放在主键索引的叶子节点,一旦数据发生迁移的话,就不用去维护辅助索引了,如果像myisam一样,只保存一个地址,一旦数据发生迁移,辅助索引的地址要跟着发生变化的。
五。影响索引的因素:
1.列的离散性
优化器会基于一些成本运算的规则去选择,列的差异性越大,离散性越好,离散性越高,选择性越好。当离散性很差时,优化器会认为此时还不如做全表扫描。

2.最左匹配原则
中文,英文比对的时候,会转为ASI码依照最左匹配原则进行比对,创建数据库的时候也可以选择一定规则的排序方式进行排序。
对索引中关键字进行计算(对比),一定是从左往右依次进行, 且不可跳过。

3.联合索引列选择原则
(1)经常用的列优先 (最左匹配原则)
(2)选择性(离散度)高的列优先(离散度高原则)
(3)宽度小的列优先(最少空间原则:列越小,路数越多)
示例:
create index name+age;创建联合索引
name+age走索引,最左匹配原则
age,不走索引
name,走索引,不需要查询到叶子节点去找索引,可以直接命中索引,能大大提高效率。

4.覆盖索引
select name,age from user where name=?
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为 覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能

将随机IO变为顺序IO的情况:扫表时和覆盖索引时。

六。索引的使用:
1.索引列的数据长度能少则少。
2.索引一定不是越多越好,越全越好,一定是建合适的。
3.匹配列前缀可用到索引 like aaa%(离散性好的话会用到,离散性不好的话就用不到),like %aaa%(用不到)、like %aaa(用不到索引);
4.Where 条件中 not in 和 <>操作无法使用索引; (选择性很差)
5.匹配范围值,order by 也可用到索引;
6.多用指定列查询,只返回自己想到的数据列,少用select *,不允许用select *的原因是:如果指定查询列,能减少交互的IO;有可能会命中覆盖索引,如果命中覆盖索引的话,就不用做叶子节点的IO操作了。
7.联合索引中如果不是按照索引最左列开始查找,无法使用索引;
8.联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;
9.联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引;
10.in,or会走索引,但是数据离散性太差的话, 也不会走索引,但是不命中索引的话,In比or要强大的多,因为in是用二分匹配法的方式查找的。or,会把所有的数据查出来之后,再一条一条比较,in,先把()内的数据排序,再查出来一条数据,用二分查找法比较。时
在MySQL中,in会在内部做一些优化,可以取代or

上一篇:MySQL事务
下一篇:MySQL之MVCC原理解析

你可能感兴趣的:(数据库,mysql,索引)