iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL索引的优缺点是什么
  • 449
分享到

MySQL索引的优缺点是什么

2024-04-02 19:04:59 449人浏览 独家记忆
摘要

这篇文章主要讲解了“Mysql索引的优缺点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引的优缺点是什么”吧!在 sql 优化中,索引是至

这篇文章主要讲解了“Mysql索引的优缺点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引的优缺点是什么”吧!

MySQL索引的优缺点是什么

sql 优化中,索引是至关重要的一环,能给查询效率带来质的飞跃,但是索引并不是万能的,不合理的索引设计甚至会拖慢查询效率。

索引定义

索引是一种专门用于帮助 SQL 高效获取数据的数据结构,一个常用的例子是,索引类似于一本书的目录,可以快速对特定值进行定位和查找,从而大大加快数据查询的效率。实际上,索引也是一张表,这张表保存了主键与索引字段,并指向实体表的记录(类似指针)。

索引优缺点

优点

  • 索引大大减小了服务器需要扫描的数据量

  • 索引可以帮助服务器避免排序和临时表

  • 索引可以将随机io变成顺序IO

  • 索引对于InnoDB(对索引支持行级)非常重要,InnoDB仅对需要访问的元组加锁,而索引能够减少InnoDB访问的元组数。如果查询不能使用索引,MySQL会进行全表扫描,并锁住每一个元组,不管是否真正需要。

缺点

  • 虽然索引大大提高了查询速度,同时却会降低更新表的速度。因为更新表时,MySQL不仅要保存数据,还要保存索引文件。因此,对应更新非常频繁的字段,通常不建议使用索引。

  • 建立索引会占用磁盘空间。

  • 如果某个数据列包含许多重复的内容,为它建立索引效果就很差,这个性质称为索引的选择性:不重复的索引值和数据表中的记录总数的比值。索引的选择性越高则查询效率越高。比如对性别字段建立索引,一百万条数据,只有男女两种可能,索引选择性为五十万分之一,索引效果就很差

  • 对于非常小的表,索引意义不大,大部分情况下简单的全表扫描更高效。

因此应该只为最经常查询和最经常排序的数据列建立索引。MySQL里同一个数据表里的索引总数限制为16个。

索引类型

按功能逻辑划分

从功能逻辑来划分,索引主要分为 普通索引、唯一索引、主键索引和全文索引

普通索引

最基本的索引,它没有任何限制。普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。

普通索引的创建有三种方式。

# 创建索引CREATE INDEX idx_username ON user_tbl(username);# 对于字符串字段,可以手动指定长度,如 user_tbl(username(5)),表示只用前五个字符来做索引,可以进一步加快查询效率,索引长度要小于字段长度# 修改表结构ALTER TABLE user_tbl ADD INDEX idx_username (username)# 创建表的时候直接指定,如CREATE TABLE user_tbl( 
	ID INT NOT NULL, 
	username VARCHAR(16) NOT NULL, 
	INDEX idx_username (username) );

删除索引

DROP INDEX idx_username ON user_tbl;

查看索引

SHOW INDEX FROM user_tbl;

唯一索引

它与前面的普通索引类似,不同的就是:普通索引允许被索引的数据列包含重复的值。而唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

唯一索引的创建跟普通索引类似:

#创建索引
CREATE UNIQUE INDEX idx_username ON user_tbl(username);

# 修改表结构
ALTER TABLE user_tbl ADD UNIQUE idx_username (username)

# 创建表的时候直接指定
CREATE TABLE user_tbl( 
	ID INT NOT NULL, 
	username VARCHAR(16) NOT NULL, 
	UNIQUE idx_username (username) 
);

主键索引

它是一种特殊的唯一索引,不允许有空值。一张表只能有一个主键,一般是在建表的时候同时创建。

CREATE TABLE user_tbl( 
	ID INT NOT NULL, 
	username VARCHAR(16) NOT NULL, 
	PRIMARY KEY(ID) 
);

与之类似的是外键索引,如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

全文索引

在上一篇文章 MySQL 基础语法 中,我们说过如果使用了 LIKE + % 开头,就索引会失效,那么当我们需要前后都模糊搜索的需求(如 LIKE ‘%hello%’),就需要使用全文索引,需要注意的是,Innodb 只有在 5.6 版本之后才支持全文索引。

全文索引的创建和删除:

# 创建的两种方法
CREATE FULLTEXT INDEX idx_name ON tbl_name(field_name);
ALTER TABLE tbl_name ADD FULLTEXT INDEX idx_name(field_name);

# 删除的两种方法
DROP INDEX idx_name ON tbl_name;
ALTER TABLE tbl_name DROP INDEX idx_name;

使用全文索引进行全模糊匹配的语法为:

SELECT XXX FROM tbl_name WHERE match(field_name) against('xxx');
# 比如对 user_tbl 的 user_name 字段加了全文索引
# 查询结果等效于 SELECT user_name, user_id FROM user_tbl WHERE user_name LIKE '%hello%';
SELECT user_name, user_id FROM user_tbl WHERE match(user_name) against('hello');

使用 explain 检查,可以发现 fulltext 索引生效。
MySQL索引的优缺点是什么

按物理实现划分

按物理实现方式来划分,通常可以分为聚集索引和非聚集索引。

聚集索引(clustered index)

存储内容是按照聚集索引排序的,聚集索引的顺序和行记录的顺序一致,一张表只能有一个聚集索引。聚集索引的叶子节点直接储存聚集索引指向的内容,因此查询的时候只需要进行一次查找。

聚集索引在创建主键时自动生成,如果没有主键,则根据第一个不为空的唯一索引自动生成,如果还没有,则自动生成一个隐式的聚集索引。

需要注意的是,在进行查询操作的时候,聚集索引的效率更高,因为少了一次查找;但是进行修改操作的时候,效率比非聚集索引低,因为直接修改了数据内容,为了标准数据内容的顺序和聚集索引顺序一致,会对数据页重新排序。

非聚集索引(non-clustered index)

非聚集索引虽然索引项是顺序存储的,但是索引项对应的内容是随机存储的,系统会维护单独的索引表来存储索引。

非聚集索引的叶子节点存储的是数据的地址,查询非聚集索引的时候,系统会进行两次查找,先查找索引,再查找索引对应位置的数据。因此非聚集索引也叫二级索引或者辅助索引。

按字段个数划分

按字段个数可以把索引分为单一索引和联合索引。

单一索引

索引字段只有一列时为单一索引,上述所有索引都是单一索引。

联合索引

将多个字段组合在一起创建的索引叫联合索引。如下:

ALTER TABLE user_tbl ADD INDEX idx_name_city_age (username,city,age);
最左匹配原则

建立这样的联合索引,其实是相当于分别建立了下面三组联合索引:

usernname,city,age
usernname,city
usernname

为什么没有 city,age 这样的联合索引呢?这是因为MySQL联合索引的最左匹配原则,只会按照最左优先的顺序进行索引匹配,也就是说,(x,y,z) 和 (z,y,x) 是不同的索引,即使是使用联合索引中的字段查询,联合索引也有可能失效。

对于 (x,y,z),只有在以下查询条件联合索引会生效:

WHERE x = 1WHERE x = 1 AND y = 1WHERE x = 1 AND y = 1 AND z = 1

对于其他情况,比如 WHERE y = 1WHERE y = 1 AND z = 1 等,就不会匹配联合索引,索引失效,注意对于 WHERE x = 1 AND z = 1,联合索引会对 x 生效,但是对 z 不生效。

可以扩展了解一下,理论上最左匹配原则中索引对 where 中子句的顺序也是敏感的,但是由于MySQL的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引,所以实际上 where 子句顺序不影响索引的效果。

要注意的是,如果联合索引查询过程中有范围查询,就会停止匹配,比如下面的语句中, z 字段不能使用到索引:

WHERE x = 1 AND y > 2 AND z = 3

顺便提一下,可以用 explain 命令来查看在某个查询语句中索引是否生效,具体用法请参考官网文档。

如果分别在 x, y, z 上建立单列索引,让该表有3个单列索引,索引效率也会大不一样,在联合索引生效的情况下,单个索引的效率远远低于联合索引。这是由 MySQL 查询优化器的执行顺序决定的,在执行一条查询 sql 时,针对索引的选择大致有如下步骤:

  1. MySQL 优化器根据搜索条件,找出所有可能使用的索引

  2. 计算全表扫描的代价

  3. 计算使用不同索引执行查询的代价

  4. 对比各种执行方案的代价,找出成本最低的那一个

因此,虽然有多个单列索引,但 MySQL 只能用到其中的那个系统认为似乎是最有效率的,其他的就会失效。

按索引结构划分

不同的 mysql 数据引擎支持不同结构的索引,按结构划分,常用的索引为 B+树索引、Hash 索引、FULLTEXT索引 等,将在下一篇文章 MySQL 索引结构 中介绍。

使用总结

接下来我们来简单总结一下在什么场景下推荐使用索引。

推荐使用

  • WHERE, GROUP BY, ORDER BY 子句中的字段

  • 多个单列索引在多条件查询是只会有一个最优的索引生效,因此多条件查询中最好创建联合索引。

    联合索引的时候必须满足最左匹配原则,并且最好考虑到 sql 语句的执行顺序,比如 WHERE a = 1 GROUP BY b ORDER BY c, 那么联合索引应该设计为 (a,b,c),因为在上一篇文章 MySQL 基础语法 中我们介绍过,mysql 查询语句的执行顺序 WHERE > GROUP BY > ORDER BY。

  • 多张表 JOIN 的时候,对表连接字段创建索引。

  • 当 SELECT 中有不在索引中的字段时,会先通过索引查询出满足条件的主键值,然后通过主键回表查询出所有的 SELECT 中的字段,影响查询效率。因此如果 SELECT 中的内容很少,为了避免回表,可以把 SELECT 中的字段都加到联合索引中,这也就是宽索引的概念。但是需要注意,如果索引字段过多,存储和维护索引的成本也会增加。

不推荐使用或索引失效情况

  • 数据量很小的表

  • 有大量重复数据的字段

  • 频繁更新的字段

  • 如果对索引字段使用了函数或者表达式计算,索引失效

  • innodb OR 条件没有对所有条件创建索引,索引失效

  • 大于小于条件 < >,索引是否生效取决于命中的数量比例,如果命中数量很多,索引生效,命中数量很小,索引失效

  • 不等于条件 != <>,索引失效

  • LIKE 值以 % 开头,索引失效

感谢各位的阅读,以上就是“MySQL索引的优缺点是什么”的内容了,经过本文的学习后,相信大家对MySQL索引的优缺点是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL索引的优缺点是什么

本文链接: https://www.lsjlt.com/news/72750.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL索引的优缺点是什么
    这篇文章主要讲解了“MySQL索引的优缺点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引的优缺点是什么”吧!在 SQL 优化中,索引是至...
    99+
    2024-04-02
  • MySQL聚簇索引的优缺点是什么
    这篇文章主要介绍“MySQL聚簇索引的优缺点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL聚簇索引的优缺点是什么”文章能帮助大家解决问题。1. 什么...
    99+
    2023-04-21
    mysql
  • mysql数据库索引的优缺点是什么
    索引是一种数据结构,用于加快数据库表中数据的检索速度。下面是索引的优缺点: 优点: 加快数据的检索速度:索引可以帮助数据库系统快速...
    99+
    2024-04-09
    mysql
  • oracle索引的优缺点是什么
    Oracle索引的优点包括: 提高查询性能:索引可以加速数据检索的速度,特别是在大型数据库中查询大量数据时。 减少磁盘IO:索引可...
    99+
    2024-04-09
    oracle
  • oracle函数索引的优点和缺点是什么
    Oracle函数索引的优点: 提高查询性能:函数索引可以帮助加快查询速度,特别是在使用函数进行数据筛选或排序时。 提高数据的...
    99+
    2024-04-09
    oracle
  • MySQL存储引擎优缺点是什么
    本篇内容介绍了“MySQL存储引擎优缺点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!今天主要分享常见的存储引擎:MyISAM、Inn...
    99+
    2023-06-02
  • mysql覆盖索引的优点是什么
    这篇文章主要介绍了mysql覆盖索引的优点是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、优点说明(1)索引项通常比记录小,因此MySQL访问数据少。(2)索引都是按...
    99+
    2023-06-15
  • oracle强制使用索引的优缺点是什么
    强制使用索引的优点: 提高查询性能:索引可以加快数据的检索速度,强制使用索引可以确保查询能够充分利用索引的优势,提高查询的性能。 ...
    99+
    2024-04-09
    oracle
  • HTTP索引中Java对象的优点和缺点是什么?
    随着互联网的发展,HTTP索引已经成为了信息查找的重要方式之一。而在HTTP索引中,Java对象占据了重要的地位。那么,Java对象在HTTP索引中的优点和缺点是什么呢?本文将从这个问题入手,详细介绍Java对象在HTTP索引中的优缺点,...
    99+
    2023-09-13
    对象 http 索引
  • PHP中的缓存数组索引:优点和缺点是什么?
    在PHP中,缓存是一个非常重要的概念。缓存可以帮助我们提高程序的性能,减轻服务器的负担。PHP中的缓存数组索引是一种常见的缓存技术,它可以在一定程度上提高程序的性能。本文将介绍PHP中的缓存数组索引的优点和缺点,并通过演示代码来说明。 优...
    99+
    2023-08-06
    缓存 数组 索引
  • mysql中div的优缺点是什么
    在MySQL中,DIV 是一个整数除法操作符,它返回除法操作的整数结果。其优点和缺点如下: 优点: DIV 操作符执行整数除法,它...
    99+
    2024-05-10
    mysql
  • mysql和sqlite的优缺点是什么
    MySQL和SQLite都是常用的关系型数据库管理系统,它们各有优点和缺点。 MySQL的优点: 大型数据库管理:MySQL支持大...
    99+
    2024-04-09
    mysql sqlite
  • oracle和mysql的优缺点是什么
    Oracle和MySQL是两种常见的关系型数据库管理系统(RDBMS),它们具有不同的优缺点。Oracle的优点:1. 性能强大:O...
    99+
    2023-08-25
    oracle mysql
  • sql索引的优缺点有哪些
    SQL索引的优点:1. 提高查询性能:索引可以加快查询速度,通过创建索引,数据库可以直接定位到要查询的数据,而不是全表扫描。2. 加...
    99+
    2023-09-05
    sql
  • MySQL 强制走索引命令 force index 优缺点
    优点:                 在MySQL中,当执行查询时,MySQL会尝试选择最佳的索引来优化查询性能。但是,有时最佳索引并不是显然的,或者可能由于某些原因(如查询中有JOIN,或者表的索引统计信息不正确等)MySQL不能正确选...
    99+
    2023-09-29
    mysql 数据库 sql
  • mysql悲观锁的优缺点是什么
    悲观锁是一种在数据操作前先获取锁,以防止其他事务对数据进行修改的方式。它的优缺点如下: 优点: 可以有效防止并发问题:悲观锁在操作...
    99+
    2024-05-08
    mysql
  • PHP中索引数组的优点是什么
    这篇文章给大家介绍PHP中索引数组的优点是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampServer,WampServe...
    99+
    2023-06-14
  • MySQL索引优化的方法是什么
    MySQL索引优化的方法有以下几种: 选择合适的列创建索引:根据查询的列和条件,选择最经常使用的列创建索引,以提高查询的效率。 ...
    99+
    2024-04-09
    MySQL
  • mysql索引优化的原则是什么
    MySQL索引优化的原则包括以下几点: 选择合适的索引类型:MySQL支持多种索引类型,包括B-Tree索引、哈希索引和全文索引...
    99+
    2023-10-28
    mysql
  • ajax的优缺点是什么
    这篇文章主要介绍“ajax的优缺点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ajax的优缺点是什么”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作