执行效率排行
1.System
**2.Const ***
mysql能对查询的某部分进行优化并将其转化成一个常量。用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快
Explain select * from (select * from film where id=1) tmp;
**3.eq_ref ***
主键 或 唯一索引 所有部分都会被链接使用,返回一条符合条件记录
Explain select * from 表名 left join 表名 on 条件id = 条件id
4.Ref *
相比eq_ref, 不适用唯一索引, 而是使用 普通索引或唯一索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行
Explain select * from 表名 where name =”film1”;
5.Fulltext
6.Ref_or_null*
类似ref,但是可以搜索值为NULL的行.
Explain select * from 表名 where name=”film1” or name is null;
7.Index_merge
8.Unique_subquery
9.Index_subquery
10.Range*
范围扫描 在 in(),betweem , > ,<,>= 等操作中,使用一个索引来检索给定范围的行。
Explain select * from 表名 where id>1;
11.Index*
和all 一样, 不同的是mysql只需要扫描索引的树, 比 all 快一些。
Explain select count() from 表名
12.All
即全表扫描,意味着mysql 要从头到尾 去查找所需要的行
需要添加索引来进行优化了
Explain select * from 表名
Possoble_keys :显示查询可能使用马偕索引来查找
Key : 显示 mysql 在索引里使用的字节数,算出使用了索引中的那些列
Ref :显示key列 记录的索引中,表查找值所用到的列或常量,常见的有const(常量),func,Null
Row: 读取并检测的行行数,不是结果集里的行数
**Filtered:**是百分比的值,代表(ros=ws * filtered) /100,结果将于前表产生交互
**Extra:**展示是额外信息
Distinct: mysql 找到了与行相联合匹配的行,就不在搜索了
Explain select distincct name from 表名 left join 表名 on 字段.id=字段.id;
Using
Index: 在对表请求列都是同一索引的部分的时候,返沪的列数据只使用了索引中的信息,二没有再去访问表中的行记录.是性能高的表现.
Using index 也叫索引覆盖
Explain select id,name from film order by id;
Where: mysql 服务器将在存储引擎检索行后进行过滤。就是先读取整行书库,再按where条件进行查询,符合就留下,不符合就丢弃。
Explain select * from film where id>1;
Temporary : mysql 需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
Explain select distinct name from actor;
Create index idx_name on actor(name);
Using filesort: 采用文件扫描对结果进行计算排序,效率很差。对于排序,只有select 字段与 order by 字段都被索引覆盖是才允许 使用 using index
Explain select name,update_time from 表名 order by 字段,字段;
Create index idx_name on actor(name,update_time);
分区表
一.什么是分区表
分区表就是把大表按条件单独存储到不同的 物理小表 中,
在结构检出的完整 逻辑表
没有分区表的话要把全部的表扫描一遍,有分区表只扫描一个就行
二.分区表优点:
更少的数据检索范围
拆分超级大的表,将部分数据加载至内存
分区表的数据更容易维护
分区表数据文件可以分布在不同的硬盘上,并发IO
减少锁的范围,避免大表锁表
可独立备份,恢复分区数据
三.如何创建分区表:
Partition by range(字段名) 在最后加
四.分区表的限制:
查询必须包含分区列,不允许对分区列进行计算
分区列必须是数字类型
发呢去表不支持建立外键索引
建表时主键必须包含所有的列
最多1024个分区