Explain语句结果中各个字段分别代表什么
id:查询语句没出现一个select关键字,MySQL就会给他分配一个唯一id
select_type: select关键字对应哪个查询的类型
simple:简单的查询 不包含任何子查询
primary:查询中如果包含复杂的子部分,最外层查询被标记为Primary
oerived:在from列表中包含的子查询被标记为derived,MySQL会递归执行这些子查询,把结果放在临时表里
table:表名
type:查询方式(是用索引还是全表)
possible_keys:可能用到的索引
key:实际用到的索引
key_len:实际使用到的索引长度
ref:显示索引的哪一列被使用了
rows:预估需要遍历的条数
extra:额外信息,比如排序等
—些常见的重要的额外信息: Using filesort,: MySQL无法利用索引完成的排序操作称为“文件排序”。 排序的时候没有使用索引 Using temporary: Mysql在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。 一般他出现会伴随着using filesort的出现,因为分组中包含了排序的过程 using temporary其实就是分组的时候没有使用索引,同时也会触发排序时没有使用索引 这两个一般考虑优化 using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。 直接从索引(索引中包含这个字段)中获取了数据 不用在查询表 Using where:表示使用了where过滤。
索引覆盖:索引覆盖其实就是你要查询的所有字段在索引中都包含,所以可以直接从索引中获取数据,
而不用再去数据库中查询。
索引失效:
1、需要满足最佳左前缀法则
如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。(要想使用索引最左侧的必须含有,右侧的可以没有)
2、满足不在索引列上做任何计算、函数操作,这些操作会导致索引失效而转向全表扫描
3、存储引擎不能使用索引中范围条件右边的列
就比如
如果给id age name设置了一个联合索引
select * from user where id =1 and age = 12 and name ="zhangsan"
这个时候三个条件都会使用索引查询
如果
select * from user where id = 1 and age>12 and name ="zhangsan"
这个时候他索引之后查询到 age>12就会停止因为 不能使用范围条件右边的列
4、MySQL在使用不等于是无法使用索引会导致全表扫描
select * from user where id!=1
5、 is null可以使用索引,但是is not null 无法使用索引
select * from user where name is not null
6、like以通配符开头会使索引失效导致全表扫描
select * from user where name like "%明"
7、字符串不加单引号 索引会失效
select * from user where name = zhangsan
8、使用or连接时索引失效
select * from user where id =1 or age = 12
排序优化:
1、尽量避免使用using fileSort 无索引排序
2、order by 语句使用索引最左前列或者使用where 子句与order by子句条件组合满足索引最左前列
3、where子句中如果出现索引范围查询 会导致order by索引失效
关联查询优化:
在MySQL中,“page”(页面)通常指的是存储引擎的数据页面或者查询执行计划中的一页结果集。
-
数据页面:存储引擎(如InnoDB)会将数据存储在物理上的数据页面中。这些页面是存储引擎用来管理和访问数据的基本单位。每个页面通常有固定的大小(例如16KB),并且存储引擎使用这些页面来存储和检索数据。
-
查询执行计划中的页面:当执行一个查询时,MySQL查询优化器会生成一个执行计划,描述如何检索和处理数据。这个执行计划可能包含多个步骤,每个步骤生成的结果集称为一个页面。这些页面描述了查询执行过程中的中间结果或最终结果的一页。
总之,在MySQL中,"page"这个术语具体含义取决于上下文,可能是关于存储引擎数据页面的物理存储单位,也可能是查询执行计划中的结果集页面。