最近一直在优化一个查询数据的接口,怎么调整查询都很缓慢,查询条件字段都有设置索引,一直好奇是哪里出了问题;突然发现一张表的索引有点区别,两个字段对应一个索引名。然后随口问了问同事,发现是组合索引(遵循”最左前缀“原则)。额,我不懂,尴尬了。重新对查询字段单独设置一个普通索引,速度立马加快了。
一. 索引的类型与区别:
Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引
主键索引(PRIMARY): 它 是一种特殊的唯一索引,不允许有空值。
唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
全文索引(FULLTEXT ): 仅可用于 MyISAM 表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时好空间;用在比较短的文本,如果就一两行字的,普通的 INDEX 就可以了。
普通索引(INDEX): 最基本的索引,没有任何限制。
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
二. 索引的使用:(普通索引,组合索引)
1. 如果针对单个字段进行查询,建立普通索引就满足了;
查看索引: show index from test_index;
创建索引:create index 索引名称 on 表名(字段名(字段长度))
create index title_index on test_index(title(10))
增加索引: alter table '表名' add index index_name on 字段名(字段长度)
删除索引: drop index 索引名称 on 表名;
drop index titile_index on test_index;
2. 如果是针对两个或两个以上条件的查询,就需要使用组合索引了;
如:将三个条件建立到一个索引里: ALTER TABLE 表名 ADD INDEX name_city_age(索引名) (Name(10),City,Age);
# 如果分别在Name,City,Age上建立单列索引,让该表有3个单列索引,查询时比上述的组合索引效率一样吧?嘿嘿,大不一样,远远低于我们的组合索引!
# 组合索引遵循”最左前缀“原则
ALTER TABLE 表名 ADD INDEX name_city_age(索引名) (Name(10),City,Age);
建立这样的组合索引,其实是相当于分别建立了三个组合索引:
1)Name, City, Age
2) Name, City
3) Name
简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个T-SQL会用到:
SELECT * FROM myIndex WHREE Name= "erquan" AND City= "郑州"
SELECT * FROM myIndex WHREE Name= "erquan"
而下面几个则不会用到:
SELECT * FROM myIndex WHREE Age=20 AND City= "郑州"
SELECT * FROM myIndex WHREE City= "郑州"
三,什么条件需使用索引
一般来说,在 where 和 join 中出现的列需要建立索引,但也不完全如此,因为MySQL只对 <,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE(后面有说明)才会使用索引。
SELECT t.Name FROM testIndex t LEFT JOIN myIndex m ON t.Name=m.Name WHERE m.Age=20 AND m.City='郑州' 时,有对myIndex表的 City 和 Age 建立索引的需要,由于testIndex表的Name开出现在了JOIN子句中,也有对Name建立索引的必要(两个表的Name 都需要建索引)。
刚才提到了,只有某些时候的LIKE才需建立索引?是的。因为在以通配符 % 和 _ 开头作查询时,MySQL不会使用索引,如
SELECT * FROM myIndex WHERE vc_Name like'erquan%' 会使用索引;
SELECT * FROM myIndex WHEREt vc_Name like '%erquan' 不会使用索引;
四. 索引不足之处:
1. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
2. 建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
源地址:https://www.jb51.net/article/69676.htm
-------------------------------------------------------------------------------------------------------------------------
navicat 手动添加索引
# 设计表,打开界面 --> 索引 --> 添加索引--> 保存

navicat 对应的参数:
1)索引类型:
normal:最基本的索引状态,所建立的索引项可以重复。
unique:与normal唯一不同的是所建立的索引项不能有重复
full text:全文搜索
2) 索引方式:
hash与btree
-
hash类型的索引:查询单条快,范围查询慢 -
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)(一般是使用这个)
1)索引方法 btree 可以用于“ >、 < 、=”查询 ,如果查id=1000的数据 建立索引后 二分查找最多13次就可以查出相应的数据;
2)hash 不能做order by排序 不能做 用like模糊查询。
介绍地址:https://blog.csdn.net/weixin_41827162/article/details/87891221
|