MYSQL查询计划查看和优化
2016-09-25 22:20
211 查看
EXPLAIN select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )
发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。
先给sc表的c_id和score建个索引
CREATE index sc_c_id_index on SC(c_id); CREATE index sc_score_index on SC(score);
Show index from SC
关键词:EXPLAIN
问怎么查看优化后的语句?
方法如下:
在命令窗口执行
查询得出的查看优化后的sql:
SELECT
`YSB`.`s`.`s_id` AS `s_id`,
`YSB`.`s`.`name` AS `name`
FROM
`YSB`.`Student` `s`
WHERE
< in_optimizer > (
`YSB`.`s`.`s_id` ,< EXISTS > (
SELECT
1
FROM
`YSB`.`SC` `sc`
WHERE
(
(`YSB`.`sc`.`c_id` = 0)
AND (`YSB`.`sc`.`score` = 100)
AND (
< CACHE > (`YSB`.`s`.`s_id`) = `YSB`.`sc`.`s_id`
)
)
)
)关键词:EXPLAIN
EXTENTED
优化建议:
总结:
1.mysql嵌套子查询效率确实比较低
2.可以将其优化成连接查询
3.连接表时,可以先用where条件对表进行过滤,然后做表连接
(虽然mysql会对连表语句做优化)
4.建立合适的索引
5.学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要
最后附上一些sql调优的总结,以后有时间再深入研究
1. 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等
2. 建立单列索引
3. 根据需要建立多列联合索引
当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低,
那么如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
4. 根据业务场景建立覆盖索引
只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率
5. 多表连接的字段上需要建立索引
这样可以极大的提高表连接的效率
6. where条件字段上需要建立索引
7. 排序字段上需要建立索引
8. 分组字段上需要建立索引
9. Where条件上不要使用运算函数,以免索引失效
参考:点击打开链接
相关文章推荐
- 从一个MySQL left join优化的例子加深对查询计划的理解
- MySQL查询优化器源码分析--多表连接优化算法之二,find_best(),搜索表之间的各种组合以得到最优的查询计划
- mysql中如何查看优化器优化后的执行计划
- mysql优化(1)show命令 慢查询日志 explain profiling(查看CPU、DISK I\O等信息)
- 从一个MySQL left join优化的例子加深对查询计划的理解
- 从一个MySQL left join优化的例子加深对查询计划的理解
- 从一个MySQL left join优化的例子加深对查询计划的理解
- MySQL查询优化器源码分析--多表连接优化算法之一,optimize_straight_join()按表的指定顺序求解最优查询计划
- mysql查缺补漏(二)mysql5.6性能优化(explain执行计划术语,索引,优化查询)
- MySQL EXPLAIN 命令: 查看查询执行计划
- 高性能可扩展mysql(执行计划,索引分析优化改写,删除重复数据,区间统计,满查询日志)
- MySQL查询优化器源码分析--多表连接优化算法之三,greedy_search(),搜索表之间的各种组合以得到最优的查询计划
- mysql 数据库表分区 方式以及优化查询查看方式介绍
- 从一个MySQL left join优化的例子加深对查询计划的理解
- MySQL 查询中的分页思路的优化
- MySQL查询优化系列讲座之调度和锁定
- 优化 MySQL 查询的 Limit 参数
- MySQL查询的性能优化
- MySQL查询优化技术系列讲座之使用索引
- MySQL查询优化技术系列讲座之使用索引