MySQL索引
Posted 飞翔的浮士德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL索引相关的知识,希望对你有一定的参考价值。
索引是什么
索引就相当于书的目录,是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索引的主要内容,如果未能解决你的问题,请参考以下文章