码迷,mamicode.com
首页 > 数据库 > 详细

MySQL索引

时间:2019-03-21 20:25:43      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:创建索引   二分   使用   span   没有   nod   慢查询   ack   过程   

索引是什么

索引就相当于书的目录,是MySQL中的一种专门的数据结构,称之为key。索引的本质原理就是通过不断地缩小查询范围,来降低io系数从而提升查询性能。                               强调:一旦围标创建了索引,以后的查询都会先用索引,在根据索引定位结果去查找数据。

为什么要用索引

对于一个应用来说,对数据库的读写比例基本上是10:1,即读多写少 而且对于写来说极少出现性能问题,大多数的性能问题都是慢查询,提到加速查询数据,就必须用到索引                                                                                     MySQL 通过b+ 树这种结构来减少io操作

b+树中每一个磁盘块 有两个数据项 一共三个地址 在查询时 会比较大小     如果小于左边就访问p1的地址  如果大于右边 就访问p3的地址  否则就访问中间p2的地址  与二分法原理相同,只不过每次都把数据分成三段 

树的结构越低越好 ,所以建议把数据量小的作为索引,来降低高度

怎么用索引

1 在表中有大量的数据的前提下,创建索引速度会变慢

2 在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低

04 聚集索引(主键)

特点:叶子节点存放的一条数据

主键索引,速度快,因为只要根据ID找到叶子节点,那么该行的所有数据拿到了  innodb需要用主键来建立数据结构,所以每一个表都应该有一个主键

05辅助索引

除了主键索引之外的所有的索引都是辅助索引

辅助索引 回单纯创建树结构,其中存储索引的数据本身以及该数据对应的主键值

查找过程中肯定出现的情况

覆盖索引:是在当前树结构中拿到了所有需要的数据

回表:是在辅助索引中没有查询的数据,就需要拿着主键的ID回到主键索引中查找

查询速度:

主键查找 》覆盖索引 》回表查找

编写sql时 如果没有主键值,优先用主键来查询,如果没有主键值,需要用辅助索引,这时候尽量少查字段,最好保证需要的数据就在辅助索引中  避免select * 

 

特点:如果是按照这个字段创建的索引

那么叶子点存放的就是:{名字:名字所在的那条记录的主键的值}

索引带来的问题

eg:800页的数据,可能需要10页的索引

1 添加索引后,整体的数据更大了 (占用额外的磁盘数据)

2 由于有了索引,多数据的添加修改删除,都会引发索引的重建(效率降低)

误区:索引不是越多越好

索引的优化

索引的优化 分为两个方面

 一  索引结构的优化

1 数据量小的

2 重复度低的作为索引

二 sql 语句的优化

sql语句中条件应该是索引字段 

避免在模糊匹配中 在最前面使用% 需要全表扫描

eg: select count(*) from usr where name like "%asssas"

不要对主键进行运算 例如where ID*10 = 100;

先算出具体的值来查询 where ID =100/10;

三 and 和or

在and 语句中MySQL 会优先查询带有索引的字段 无论书写位置在前还是在后  name 有索引但是重复度高 ID么有索引的字段 ,email 有索引 会跳过ID直接查email

eg:select count(*)from usr where name = "jack" and  id = 1 and email ="xxxx";

and 语句中么有优化的余地

or语句中 不会自动选择有索引的 是依次执行,无论是否有条件成立 都查一遍,所以应该避免使用or语句

or语句的优化

select * from usr where name = "张三” or name ="李四";

select * from usr where name in (“张三”,“李四”);

最终优化

select * from usr where name = “张三”

union 

select * from usrwhere name = “李四”;

四 多字段联合查询

如果要查询的字段较多,如果为每一个字段都创建索引会造成额外的容量的占用 ,并且当你修改一条记录时,有可能所有的索引都需要重建,所以会非常慢

顺序是重点

create index 索引的名字 on 表名(字段名);

删除索引 

drop index 索引名字 on 表名;

 

MySQL索引

标签:创建索引   二分   使用   span   没有   nod   慢查询   ack   过程   

原文地址:https://www.cnblogs.com/tangda/p/10574060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!