MYSQL的索引类型 || navicate 手动创建索引

论坛 期权论坛 脚本     
匿名技术用户   2021-1-5 05:50   27   0

最近一直在优化一个查询数据的接口,怎么调整查询都很缓慢,查询条件字段都有设置索引,一直好奇是哪里出了问题;突然发现一张表的索引有点区别,两个字段对应一个索引名。然后随口问了问同事,发现是组合索引(遵循”最左前缀“原则)。额,我不懂,尴尬了。重新对查询字段单独设置一个普通索引,速度立马加快了。

一. 索引的类型与区别:

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

  1. hash类型的索引:查询单条快,范围查询慢

  2. btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)(一般是使用这个)

1)索引方法 btree 可以用于“ >、 < 、=”查询 ,如果查id=1000的数据 建立索引后 二分查找最多13次就可以查出相应的数据;

2)hash 不能做order by排序 不能做 用like模糊查询。

介绍地址:https://blog.csdn.net/weixin_41827162/article/details/87891221

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP