什么是索引
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
例如这样一个查询:select * from table1 where id=10000
如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法(B+ 树)优化过的,因而查找次数要少的多。可见,索引是用来定位的。
为什么使用索引
从上面的例子可以看出来使用索引的一大好处就是可以大大提高查询速度,如果把使用索引的MYSQL比作一辆兰博基尼,没使用索引的MYSQL就相当于一辆马车。
索引分单索引和组合索引,单列索引就是一个索引只包含一个列,一个表可以包含多个单列索引。
组合索引是一个索引包含多个列。
使用索引的优点是可以大大提高查询速度,缺点就是更新表的速度会变慢。在更新表的时候MYSQL不但要保存数据,还要保存索引。索引也会占用磁盘空间。
数据库索引有哪些
1.聚簇索引(主键索引):主键上的索引,表的所有字段都会根据主键排序
2.非聚簇索引:普通字段的索引
3.联合索引:一个索引包含多个字段
key 'name_age_sex' ('name', 'age', 'sex')
联合索引遵从最左前缀原则:
根据上面的联合索引,下面的几个查询语句哪个会使用索引呢?
A: select * from user where name = 'zhangsan' and age = 16 and sex = '男'
B: select * from user where age = 16 and name = 'zhangsan' and sex = '男'
C: select * from user where age = 16 and name = 'zhangsan'
D: select * from user where name = 'zhangsan' and age > 10 and sex = '男'
E: select * from user where name != 'zhangsan' and age = 10
F: select * from user where name = 'zhangsan' and age != 10
A:符合最左前缀原则name第一个,age第二个,sex第三个
B:也符合,这条语句会被转换成和A一样的语句
C:不符合,直接从age开始
D:因为age是范围查找,name和age使用索引,范围查找后面的不会使用索引,所以sex不会使用索引查找
E:!=不走索引,索引都不使用索引
F:name走索引,后面的不走,理由同上
什么情况不使用索引
key 'age' (age)
key 'name' (name)
LIKE
like后面的值%在前面的不使用索引,在后面的使用索引
# 使用索引
select * from user where name like 'zhang%'
# 不使用索引
select * from user where name like '%zhang'
使用索引进行计算的
# 使用索引
select * from user where age = 10 + 8
# 不使用索引
select * from user where age + 8 = 10
对索引列用函数
# 不使用索引
select * from user where concat('name', 'san') = 'zhangsan'
# 使用索引
select * from user where name = concat('zhang', 'san')
对索引列使用'!='的
# 不使用索引
select * from user where name != 'zhangsan'