转载自:数据库索引之优化查询速度_aogogo的博客-优快云博客_数据库查询速度
(一)索引的作用
索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,
数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,
5秒以上就已经让人难以忍受了。
(二)mysql的索引类型:
mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。
1)主键索引:主键索引是加在主键上的索引,设置主键(primary key)的时候,它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引;
2)普通索引:创建在非主键列上的索引,这是最基本的索引;
3)唯一索引:索引列的值必须唯一,但允许有空值。
4)聚合索引:创建在多列上的索引。
(三)索引的语法:
查看某张表的索引:show index from 表名;
创建普通索引:alter table 表名 add index 索引名 (加索引的列)
创建聚合索引:alter table 表名 add index 索引名 (加索引的列1,加索引的列2)
删除某张表的索引:drop index 索引名 on 表名;
(四):使用索引的代价
1:索引需要占用硬盘空间,这是空间方面的代价
2:一旦插入新的数据,就需要重新建立索引,这是时间代价
(五):什么情况下不建议使用索引
1:数据量小(只有几千条),这时查询用的时间也不会久,因此,建立索引意义不大。
2:如果某个字段重复率很高,或大多数值是空的,那么不建议对该字段建立索引。
(六):什么情况下,不会触发索引
1:select name from 商品表。
没有where 不会触发索引
2:select name from 商品表 WHERE name like '%cc';
模糊查询时是可以触发索引的,但是%出现在第一个位置查询不会走索引
select name from 商品表 WHERE name like 'cc%'; 是会触发索引
3: select name from 成绩表 WHERE 成绩+40=100;
当索引字段 进行某种左值操作,不会用到索引。
4:select * from 商品表 WHERE substr(name)="ff";
如果对索引字段进行了函数操作,那么无法用到索引
5: select * from 商品表 where 索引=1001 OR name='ff';
OR 的两边出现非索引字段 不会使用索引
6: 当 索引是多个字段组成的时候,查找时没有包含排在开头的那个字段 不会触发索引。
索引 PRIMARY KEY (`a`,`b`,`b`)
select * from where b=1; 时不会触发索引。
select * from where a=1; 时会触发
(7)主键索引的速度 远快于 非主键索引
当主键有多个的时候,其实只有 排在第一个的有索引,其他的没有索引速度还是很慢