Mysql Query Optmize: 查询优化器, SQL语句会给Query Optimize他会执行他认为最优的方式..
Mysql 常见问题
CPU饱和,IO磁盘发生在装入数据大于内存时.
Explain 查询解析使用
id, select_type, table,type, possible_keys, key , key_len, ref, rows, Extra
id - 表的执行顺序
值相同: 按顺序执行
值不同,: 值越大, 先执行. 如子查询
select_type - 数据读取操作的操作类型
SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION, UNION RESULT 主要6个表示子查询,复杂查询等
table - 表名
derived 虚表
type - 访问类型
最好的的依次:
system > const > eq_ref > ref > fulltext > ref_or_null> index_merge > unique_subquery > index_subquery> range > index > all
system > const > eq_ref > ref > range > index > all , 主要常用最好到ref range级别
all: 全表扫描, 从硬盘读取数据
index: index全索引扫描,比All快.比如只找主键列值
range: 检索指定范围的行, 使用索引来选择行,
ref: 非唯一性索引扫描, 返回所有匹配的单独行,可以找到多个复合条件的行, 属于查找和扫描的混合体, 比如复合索引2列,找其中1列..
eq_ref: 唯一性索引扫描, 表只有一条记录与之匹配, 常见主键货唯一索引, 比如部门表,ID唯一,员工表有部门id, 联合查询
const: 通过索引1次找到, 主键,唯一键 只匹配一行数据,比如通过主键查一条记录
system: 只有一条记录的表, 忽略不计
- 哪些索引可以使用
possible_keys: 可能使用的索引, 不一定使用
key: 真实使用的索引,若为NULL未使用索引, 若使用覆盖索引(查询的列被索引覆盖),则只出现在key中, 比如查询的字段是复合索引的顺序一样,列一样,
key_len 标识索引使用的字节数, 越少越好,
rows - 哪些行被优化器查询
Extra - 包含不适合在其他列中显示的十分重要的信息
Using filesort: (严重)文件索引, 无法利用索引完成的排序,排序按照索引顺序.
Using temporary (严重)生成了临时表
Using index 效率不错, 索引被用来执行索引键值查找,
Using where
Using join buffer, 使用连接缓存JOIN使用比较多
Impossible where SQL有问题, 不可能的SQL
select tables optimezed away
distinct