MySQL高频(存储引擎与索引优化)(一)

MySQL高频必刷重点面试

1 . MySQLl存储引擎有哪些?

MyISAM indexed sequential access method (有索引的顺序访问方法)
MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索
不是事务安全的,而且不支持外键。
MEMORY 也是以前的(HEAP) 该类型表存储在内存中,表的索引是哈希分布的。
merge 这些表为了查询目的,把myisam 表集合作为单个表,因此你可以在某些操作系统中避开最大文件大小的限制。
archive 这种类型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。
csv 这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。
innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。
修改mysql存储引擎alter table tablename type = innodb;

2 . MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?

两种存储引擎的大致区别表现在:
1.InnoDB支持事务,MyISAM不支持, 这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
2.MyISAM适合查询以及插入为主的应用。
3.InnoDB适合频繁修改以及涉及到安全性较高的应用。
4.InnoDB支持外键,MyISAM不支持。
5.从MySQL5.5.5以后,InnoDB是默认引擎。
6.InnoDB不支持FULLTEXT类型的索引。
7.InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表。
8.对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
9.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除,效率非常慢。MyISAM则会重建表。
10.InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’。

3 . MySQL存储引擎MyISAM与InnoDB如何选择?

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个。
关于MySQL数据库提供的两种存储引擎,MyISAM与InnoDB选择使用:
INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MyISAM不支持。
MyISAM的性能更优,占用的存储空间少,所以,选择何种存储引擎,视具体应用而定。
如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。
如果你的应用程序对查询性能要求较高,就要使用MyISAM了。MyISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MyISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。
有人说MyISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。
现在一般都是选用innodb了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。
MEMORY存储引擎
MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。
每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。
值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。
MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。
注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。

4 . MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?

事务处理上方面
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
锁级别
MyISAM:只支持表级锁,用户在操作MyISAM表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

5 . 简述MySQL常用存储引擎的锁机制?

MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

6 . 简述InnoDB 存储引擎有几种锁算法?

Record Lock — 单个行记录上的锁;
Gap Lock — 间隙锁,锁定一个范围,不包括记录本身;
Next-Key Lock — 锁定一个范围,包括记录本身

7 . 如何调整my.cnf参数配置实现InnoDB引擎性能优化 ?

步骤一:备份原有my.cnf文件
在修改my.cnf文件前,我们应该先备份原有的my.cnf文件,以便在修改出现问题时可以恢复到原有配置。
cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
步骤二:优化my.cnf参数配置
以下是一些通过my.cnf参数配置实现InnoDB引擎性能优化的参数:
#为InnoDB启用调整性能参数
[mysqld]
#缓冲池大小
innodb_buffer_pool_size = 1G
#日志文件大小
innodb_log_file_size = 256M
#线程池大小设置
innodb_thread_concurrency = 8
#自动合并线程空闲时间
innodb_thread_sleep_delay = 10000
#撤销段设置大小
innodb_undo_tablespaces = 2
#稳定的睡眠时间调度是否启用
innodb_adaptive_flushing = 1
#添加外键索引检查
innodb_adaptive_hash_index = 1
innodb_buffer_pool_size:指定InnoDB缓冲池的大小,该值的合理设置对于提升InnoDB性能非常重要。一般建议将innodb_buffer_pool_size设置为物理内存的70%-80%。
innodb_log_file_size:指定InnoDB日志文件的大小,默认为48M,一般建议将其设置为物理内存的1/4,比如如果系统物理内存为4G,则innodb_log_file_size的推荐设置为1G。
innodb_thread_concurrency:指定InnoDB可同时运行的线程数,一般根据CPU核心数量设置,比如CPU为8核,则可以将innodb_thread_concurrency设置为8。
innodb_thread_sleep_delay:指定InnoDB自动合并线程的空闲时间间隔,单位是纳秒。该值默认为10000(10毫秒)。
innodb_undo_tablespaces:指定InnoDB撤销段的个数。建议将其设置为2-3,以便在撤销表时可以并行处理。
innodb_adaptive_flushing:开启InnoDB自适应刷新,可以最大限度地降低InnoDB写入操作的开销。
innodb_adaptive_hash_index:开启外键索引检查,可以提高InnoDB性能。
步骤三:重启MySQL服务使参数生效
修改完成my.cnf文件后,应重启MySQL服务以使修改的参数生效。

8 . MySQL的InnoDB 引擎的四大特性是什么?

插入缓冲(Insert buffer)
Insert Buffer 用于非聚集索引的插入和更新操作。先判断插入的非聚集索引是否在缓存池中,如果在则直接插入,否则插入到 Insert Buffer 对象里。再以一定的频率进行 Insert Buffer 和辅助索引叶子节点的 merge 操作,将多次插入合并到一个操作中,提高对非聚集索引的插入性能。
二次写 (Double write)
Double Write 由两部分组成,一部分是内存中的 double write buffer,大小为 2MB,另一部分是物理磁盘上共享表空间连续的 128 个页,大小也为 2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是通过 memcpy 函数将脏页先复制到内存中的该区域,之后通过 doublewrite buffer 再分两次,每次 1MB 顺序地写入共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免操作系统缓冲写带来的问题。
自适应哈希索引 (Adaptive Hash Index)
InnoDB 会根据访问的频率和模式,为热点页建立哈希索引,来提高查询效率。索引通过缓存池的 B+ 树页构造而来,因此建立速度很快,InnoDB 存储引擎会监控对表上各个索引页的查询,如果观察到建立哈希索引可以带来速度上的提升,则建立哈希索引,所以叫做自适应哈希索引。
缓存池
为了提高数据库的性能,引入缓存池的概念,通过参数 innodb_buffer_pool_size 可以设置缓存池的大小,参数 innodb_buffer_pool_instances 可以设置缓存池的实例个数。缓存池主要用于存储以下内容:
缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲 (insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息 (lock info)和数据字典信息 (data dictionary)。

9 . 简述MySQL中有几种索引类型?

FULLTEXT :即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
HASH :由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
RTREE :RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找。

10 . 简述MySQL 聚簇索引和非聚簇索引的区别 ?

聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引
非聚簇索引的叶子节点存放的是主键值或数据记录的地址(InnoDB辅助索引的data域存储相应记录主键的值,MyISAM辅助索引的data域保存数据记录的地址)

11 . 描述MySQL中,索引,主键,唯一索引,联合索引的区别?

(1)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
(2)普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
(3)普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列只包含彼此各不相同的值,在为这个数据索引创建索引的时候就应该用关键字UNIQE把它定义为一个唯一所以,唯一索引可以保证数据记录的唯一性。
(4)主键,一种特殊的唯一索引,在一张表中只能定义一个主键索引,逐渐用于唯一标识一条记录,是用关键字PRIMARY KEY来创建。
(5)索引可以覆盖多个数据列,如像INDEX索引,这就是联合索引。
(6)索引可以极大的提高数据的查询速度,但是会降低插入删除更新表的速度,因为在执行这些写操作时,还要操作索引文件。

12 . 阐述详解MySQL单列索引和联合索引?

单列索引
定义
单列索引(也称为单字段索引或简单索引)是对一列或多列中的单个字段创建的索引。单列索引包括唯一索引和普通索引两种类型。
唯一索引:索引字段的值必须唯一,或者允许为NULL(但只允许一个NULL值)。创建唯一索引的语法如下:
CREATE UNIQUE INDEX index_name ON table_name (column_name)
普通索引:索引字段的值可以重复。创建普通索引的语法如下:
CREATE INDEX index_name ON table_name (column_name)
优缺点
优点:单列索引查询速度快,适用于单一查询、排序的场景;
缺点:当索引字段数据重复度很高时,查询性能可能退化,造成表扫描,甚至比不使用索引还慢。
示例说明
以查询学生表中姓“王”的学生信息为例,创建单列索引可用以下两种语法:
使用CREATE INDEX语句创建普通索引:
CREATE INDEX idx_stu_name ON student (name);
使用ALTER TABLE语句添加普通索引:
ALTER TABLE student ADD INDEX idx_stu_name (name);
联合索引
定义
联合索引(也称为组合索引)是多个列上的索引,可加速联合查询和模糊查询的速度。联合索引可以包含多个列,这些列可以使用多种不同的索引类型进行定义。常见的索引类型包括B-Tree索引、哈希索引和全文索引。
B-Tree索引:用于常规查询;
哈希索引:用于精确查询;
全文索引:用于全文查询。
定义
定义联合索引的语法如下:
CREATE INDEX index_name ON table_name (column1, column2, …);
优缺点
优点:联合索引可以加速多个列查询的速度,适用于多条件查询的场景;
缺点:当查询条件不涉及索引起始列时,索引失效,需要进行全表扫描。
示例说明
以查询学生表中姓“王”且年龄在20到25岁之间的学生信息为例,创建联合索引可用以下语句:
CREATE INDEX idx_stu_info ON student (name, age);

ALTER TABLE student ADD INDEX idx_stu_info (name, age);
然后使用以下SQL语句进行查询:
SELECT * FROM student WHERE name = ‘王’ AND age BETWEEN 20 AND 25;
总结
单列索引和联合索引各有优缺点,应根据实际应用场景进行选择。单列索引适用于单一查询、排序的场景,联合索引适用于多条件查询的场景。因此,在表设计时应考虑到数据的读写模式、SQL执行计划等因素,并合理地使用索引以达到优化查询速度的目的。

13 . 详细阐述MySQL联合索引?

1、联合索引是两个或更多个列上的索引。
对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
例如索引是key index (a,b,c). 可以支持a 、 a,b 、 a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。
如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不知道姓,电话簿将没有用处。

14 . Hash 索引和 B+ 树索引有什么区别 ?

首先要知道 Hash 索引和 B+ 树索引的底层实现原理:
hash 索引底层就是 hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+ 树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。
那么可以看出他们有以下的不同:
hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而 B+ 树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
hash 索引不支持使用索引进行排序,原理同上。
hash 索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为 hash 函数的不可预测。
hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询
hash 索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差。而 B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。
因此,在大多数情况下,直接选择 B+ 树索引可以获得稳定且较好的查询速度。而不需要使用 hash 索引

15 . MySQL 创建索引可以使用多少列?

可以为任何标准表创建最多 16 个索引列。

16 . MySQL如何写SQL能够有效的使用到复合索引?

复合索引,也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。
当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。
select * from table where k1=A AND k2=B AND k3=D
有关于复合索引,我们需要关注查询Sql条件的顺序,确保最左匹配原则有效,同时可以删除不必要的冗余索引

17 . MySQL列值为NULL时,查询是否会用到索引?

列值为NULL也是可以走索引的
计划对列进行索引,应尽量避免把它设置为可空,因为这会让 MySQL 难以优化引用了可空列的查询,同时增加了引擎的复杂度

18 . MySQL中如何对Full Text Search全文索引优化?

创建了全文索引,就可以使用MATCH AGAINST()语法进行全文搜索。
例如,如果我们想要在mytable表中搜索关键词MySQL,则可以使用以下语句:
SELECT * FROM mytable WHERE MATCH(title,content) AGAINST(‘MySQL’);
在进行全文索引优化时,我们可以尝试以下方法:
调整词汇表:MySQL使用自然语言处理库来分析文本,我们可以通过修改MySQL的my.ini文件来调整该库的设置,以便更好地适应我们的环境。
限制搜索范围:如果我们只需要搜索一个特定的列,可以将搜索范围限制在该列上,这样可以提高搜索效率。
调整词汇长度:默认情况下,MySQL会忽略长度少于3个字符的词汇,我们可以将该设置调整为2或1,从而扩大搜索范围。

19 . 简述如何对MySQL优化器对索引和JOIN顺序选择 ?

索引优化的选择过程
MySQL优化器在选择索引时会根据以下因素进行考虑:
索引的可用性:优化器会根据索引的选择性,即索引列中不同值的数量,来评估索引的可用性。选择性越高的索引能够更好地提高查询效率。
索引的覆盖度:在使用覆盖索引时,查询只需要扫描索引而无需访问表中的数据,能够大大提高查询速度。
索引的存储方式:MySQL支持多种类型的索引,如B树索引、全文索引、哈希索引等。优化器会根据查询的条件和数据分布情况,选择最合适的索引类型。
JOIN顺序的选择过程
在SELECT语句中有多个表进行了JOIN操作时,MySQL优化器会根据以下考虑进行JOIN顺序的选择:
表的大小:将较小的表放在JOIN的左侧,能够提高查询效率。这是由于将小表作为驱动表,可以使用快速的嵌套循环算法进行JOIN操作,而避免使用较慢的排序算法。
索引的可用性:当JOIN条件可以使用索引时,优化器会优先选择使用索引的JOIN算法。例如,使用索引嵌套循环算法或索引哈希算法能够快速地完成JOIN操作。
卡片型查询的处理:卡片型查询是指其中一个表的结果集非常小。在这种情况下,优化器会选择使用连接类型为“循环连接(Loop Join)”的算法,有效避免Join导致的内存不足异常。

20 . MSQL设计索引的时候,我们一般需要考虑哪些因素?

1.数据量超过三百,理论上应创建索引
2.经常与其他表链接的表,在链接字段应创建索引 on 两边的字段,都要建立索引
3.经常出现在where子句中的字段,尤其是大表,应创建索引
4.索引应创建在选择性高,重复度低的字段上,如员工表,姓名和性别都作为查询条件,姓名更适合建立索引。如果两个同时建立了索引,MySQL也会自动选择以姓名作为索引查询
5.索引应该建立在小字段上,对于大的文本甚至超长字段,尽量不建立索引
6.复合索引
① 正确选择复合索引中的主列字段,一般是选择性较好的字段
② 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有? 如果是,则可以建立复合索引;否则考虑单字段索引
③ 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引
④ 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引
7.索引维护也需要成本,频繁增删的数据表,谨慎选择索引
查询中排序的字段,应该创建索引( B + tree 有顺序)
统计或者分组字段,应该创建索引

21 . 简述什么情况下设置了索引但无法使用?

索引哪些情况会失效
查询条件包含or,可能导致索引失效
如何字段类型是字符串,where时一定用引号括起来,否则索引失效
like通配符可能导致索引失效。
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
在索引列上使用mysql的内置函数,索引失效。
对索引列运算(如,+、-、*、/),索引失效。
索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
索引字段上使用is null, is not null,可能导致索引失效。
左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
mysql估计使用全表扫描要比使用索引快,则不使用索引。

22 . MySQL如何实施Hash索引优化 ?

Hash是一种非常高效的索引类型,它将索引值与一组固定大小的桶相对应,并且能够快速准确地确定所搜索的记录位置,它将记录散列分散到不同的桶中,通过一个hash函数的计算可以得到对应桶的编号,然后直接查询该桶即可,而不需要遍历整个索引。
【Hash索引的优点和缺点】
优点
Hash索引的查询速度非常快,因为它能够快速定位到对应的记录位置。
适用于等值查询操作,因为Hash索引只支持等值查询。
对于大量数据或者重复数据情况下,Hash索引比较适用,因为Hash索引能够将相同的记录散列到同一个位置上,从而提高索引的效率。
缺点
Hash索引只支持等值查询,不支持范围查询和排序等操作。
Hash索引对查询的记录数有限制,因为Hash散列表的大小有限,当记录过多时,会导致Hash索引失效,因此适用于单表的记录数比较少的情况下。
如何优化Hash索引
在什么情况下使用Hash索引
Hash索引适用于单表的记录数比较少的情况下,例如30万以下的数据量。
对于大量数据或者重复数据情况下,Hash索引比较适用,因为Hash索引能够将相同的记录散列到同一个位置上,从而提高索引的效率。
只适合于等值查询操作。
如何优化Hash索引
风险预测:在建立Hash索引之前,需要对业务数据进行风险预测,判断在当前的数据量和变化曲线下是否适合使用Hash索引。
存储引擎选择:在选择使用Hash索引的存储引擎上,需要尽可能地选择InnoDB引擎,因为InnoDB存储引擎内置Hash索引,能够免去外部维护的成本。
选择合适的Hash函数:选择合适的Hash函数是Hash索引优化的重要一步,因为Hash函数决定了索引的散列方式和影响键值在桶之间分布的程度,进而影响到查询Hash索引的效率。在选择Hash函数时需要考虑业务数据的特点,保证Hash函数的性能指标达到最优。
Hash冲突处理:Hash索引在散列过程中,可能会遇到Hash冲突的问题,这时候需要进行Hash冲突的特殊处理。常见的Hash冲突处理办法有:开放地址法、链接法和二次Hash法等

23 . MySQL如何使用Explain优化SQL和索引?

对于复杂、效率低的sql语句,我们通常是使用explain sql 来分析sql语句,这个语句可以打印出,语句的执行。这样方便我们分析,进行优化
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
all:full table scan ;MySQL将遍历全表以找到匹配的行;
index: index scan; index 和 all的区别在于index类型只遍历索引;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值的行,常见与between ,等查询;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;
const,system:当MySQL对某查询某部分进行优化,并转为一个常量时,使用这些访问类型。如果将主键置于where列表中,MySQL就能将该查询转化为一个常量。
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MySQL认为必须检查的用来返回请求数据的行数
Extra:关于MySQL如何解析查询的额外信息。

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值