一、在一个表执行了分别执行了两条语句:
a.SELECT ID FROM MNG_ROLE ORDER BY ID; -- 耗时37秒
b.SELECT ID FROM MNG_ROLE ORDER BY ID, NAME; -- 耗时0.01秒
c.SELECT ID FROM MNG_ROLE; -- 耗时0.22秒
二、表结构如下,插入3万条数据,而且REMARK和RESERVER字段都是填满数据:
====================================================
CREATE TABLE `MNG_ROLE` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`NAME` varchar(50) NOT NULL,
`CREATE_DATE` char(8) NOT NULL,
`CREATE_TIME` char(6) DEFAULT NULL,
`UUID` char(32) NOT NULL,
`REMARK` varchar(3000) NOT NULL DEFAULT ‘‘,
`RESERVER` varchar(3000) NOT NULL DEFAULT ‘RESERVER‘,
PRIMARY KEY (`ID`),
UNIQUE KEY `UK_UUID` (`UUID`) USING BTREE,
KEY `INDEX_NAME_CREATE_DATE_TIME_REMARK` (`NAME`,`CREATE_DATE`,`CREATE_TIME`,`REMARK`(255)) USING BTREE,
KEY `ID_NAME` (`ID`,`NAME`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=300001 DEFAULT CHARSET=utf8
====================================================
这个表建立了一个主键索引(ID),唯一键约束(UUID),普通索引(INDEX_NAME_CREATE_DATE_TIME_REMARK、ID_NAME)而且需要注意的是,这里有两个字符数为3000的字段,而且在表中的数据都是填满的。
三、首先我们分析两个语句EXPLAIN的结果:
MariaDB [yjtmng]> EXPLAIN SELECT ID FROM MNG_ROLE ORDER BY ID;
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | MNG_ROLE | index | NULL | PRIMARY | 4 | NULL | 145134 | Using index |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
1 row in set (0.00 sec)
MariaDB [yjtmng]> EXPLAIN SELECT ID FROM MNG_ROLE ORDER BY ID, NAME;
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | MNG_ROLE | index | NULL | ID_NAME | 156 | NULL | 145134 | Using index |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
1 row in set (0.00 sec)
MariaDB [yjtmng]> explain SELECT ID FROM MNG_ROLE;
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | MNG_ROLE | index | NULL | UK_UUID | 96 | NULL | 145134 | Using index |
+------+-------------+----------+-------+---------------+---------+---------+------+--------+-------------+
1 row in set (0.00 sec)
上面两个查询,前者是用到了主键索引,后两者用到了辅助索引,但是为什么用到主键索引会更慢呢?上述三个查询的type=index,这个方式跟全表扫描一样,只是MySQL扫描表时按索引次序进行而不是行。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。
四、分析:
1.由于表的存储引擎采用的InnoDB,InnoDB的索引属于聚集索引,就是说表数据文件和索引文件都是同一个,表数据的分布按照主键排序,以BTREE数据格式存储,而辅助索引的叶子节点指向的是对应的主键。而上述表的REMARK和RESERVER的数据很多,导致硬盘存储的数据块很多,而主键索引的查找就会因为数据块的增多,导致更多的IO操作,降低查询效率。
而MyISAM引擎的索引属于非聚集索引,索引文件跟数据文件是分开的。而索引文件的所指向的是对应数据的物理地址。
2.EXPLAIN 三个查询的Extra都是“Using index”,表示这三个查询的数据都是直接从索引获取的,没有通过主键,再获取对应的一行数据,这就是索引覆盖。
所以第1、3个查询都是直接从辅助索引中查询,并且获取索引值返回,大大加快了效率,但是第三个查询,MySQL会自动采用唯一键"UUID"作为索引,这是为什么呢。而第二个遍历的是主键索引,而且数据量大,IO操作频繁。
相关推荐
LNH_MySQL 18-主键-唯一-普通索引创建及删除小结.mp4
MySQL中的索引是一种数据库结构,用于加速数据查询速度。索引可以类比为书籍的目录,使得数据库系统能更快地定位到所需的数据行。在实验报告中,我们主要涉及了索引的创建、管理和维护,以及对不同类型的索引的操作...
MySQL 数据库索引详解 MySQL 数据库索引是一种特殊的数据库结构,可以快速查询数据库表中特定记录。索引是提高数据库性能的重要方式。 索引的概念 ---------------- 索引是表中数据的目录。如果使用索引,则扫描...
【MySQL索引 使用笔记】 MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的...
总结来说,主键索引和辅助索引在MySQL中扮演着不同的角色,主键负责保证数据的唯一性和表的物理组织,而辅助索引提供了对不同列的快速访问。合理设计和使用这两种索引,能显著提升数据库的查询效率。在实际应用中,...
### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...
### MySQL索引最佳实践 #### 一、理解MySQL索引的重要性 索引是数据库性能优化中最常用也是最重要的手段之一。合理的索引设计可以显著提高查询效率,减少服务器资源的消耗。在MySQL中,索引的选择与配置对于开发...
- **主键索引**:基于主键建立的索引,不允许重复且不能为空。 - **唯一索引**:索引列的值必须是唯一的,但允许空值。 - **普通索引**:用表中的任意列构建的索引,无特殊限制。 - **全文索引**:适用于搜索大文本...
【MySQL面试题】在面试MySQL相关的职位时,面试官可能会问到一系列关于数据库基础、SQL语法、事务处理、索引优化以及性能调优的问题。以下是一些可能的面试重点: 1. **数据库基本概念**: - 数据库是用于存储和...
主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据...
MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...
### MySQL索引和锁机制详解 #### 一、索引基础 **索引定义:** 索引是MySQL中用于提高查询效率的一种数据结构。通过索引可以在数据表中快速定位到所需的数据行,大大减少不必要的全表扫描。 **索引的重要性:** 1....
主键索引提供了最快的访问速度,因为主键通常是自增ID或类似的数据类型,能够均匀分布。 ##### 2.2 非主键索引 非主键索引通常指的是次级索引或者辅助索引,它们同样采用B+树结构。与主键索引不同,非主键索引的...
聚集索引的主键索引实际上就是数据表的物理排列顺序,每条记录的主键值决定了其在磁盘上的位置。这意味着,如果你通过主键查询,可以直接定位到数据,无需进行额外的查找。相反,如果创建了非主键的聚集索引,那么...
### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...
主键索引是唯一的,而其他索引可以是非唯一。 4. **事务**:在MySQL中,事务是一组SQL语句,它们作为一个整体一起成功执行或全部回滚。这对于保持数据的一致性至关重要。 5. **视图**:视图是从一个或多个表中选择...
MySQL 存储引擎实验报告 本实验报告的主要内容是了解 MySQL 存储引擎的概念、设置和特点,并掌握 MySQL 存储引擎的使用方法。实验中涉及到多种存储引擎,包括 MyISAM 和 InnoDB,考察它们的相同点和区别,并对它们...
3. **主键索引**:一种特殊的唯一索引,不允许值为空。通常在创建表时同时创建主键索引,如: - `CREATE TABLE testIndex (i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(16) NOT NULL, PRIMARY KEY (i_...