使用explain分析sql语句
2015-12-09 12:34
381 查看
sql语句优化 1: sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 这两个时间并非孤立的, 如果单条语句执行的快了,对其他语句的锁定的也就少了. 所以,我们来分析如何降低执行时间. 2: sql语句的执行时间,又花在哪儿了? 答: a: 查 ----> 沿着索引查,甚至全表扫描 b: 取 ----> 查到行后,把数据取出来(sending data) 3: sql语句的优化思路? 答: 不查, 通过业务逻辑来计算, 比如论坛的注册会员数,我们可以根据前3个月统计的每天注册数, 用程序来估算. 少查, 尽量精准数据,少取行. 我们观察新闻网站,评论内容等,一般一次性取列表 10-30条左右. 必须要查,尽量走在索引上查询行. 取时, 取尽量少的列. 比如 select * from tableA, 就取出所有列, 不建议. 比如 select * from tableA,tableB, 取出A,B表的所有列. 4: 如果定量分析查的多少行,和是否沿着索引查? 答: 用explain来分析 explain的列分析 id: 代表select 语句的编号, 如果是连接查询,表之间是平等关系, select 编号都是1,从1开始. 如果某select中有子查询,则编号递增. mysql> explain select goods_id,goods_name from goods where goods_id in (sele ct goods_id from goods where cat_id=4) \G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: goods type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 31 Extra: Using where --------------------------------------------------------------------- 参数解释:
select_type: 查询类型
![](http://images2015.cnblogs.com/blog/498475/201512/498475-20151209121821730-198895193.png)
(1) all: 意味着从表的第1行,往后,逐行做全表扫描.,运气不好扫描到最后一行.
(2) index: 比all性能稍好一点,通俗的说: all 扫描所有的数据行,相当于data_all index 扫描所有的索引节点,相当于index_all
(3) range: 意思是查询时,能根据索引做范围的扫描 如sql:
explain select goods_id,goods_name,shop_price from goods where goods_id >25 \G
(4) ref 意思是指 通过索引列,可以直接引用到某些数据行 如sql: explain select goods_id,goods_name from goods where cat_id=4 \G (5) eq_ref 是指,通过索引列,直接引用某1行数据 常见于连接查询中
explain select goods_id,shop_price from goods innert join ecs_categoy using(cat_id) where goods_id> 25 \G
(6) const, system, null 这3个分别指查询优化到常量级别, 甚至不需要查找时间.
一般按照主键来查询时,易出现const,system 或者直接查询某个表达式,不经过表时, 出现NULLexplain select goods_id,goods_name,click_count from goods wher_id=4 \G
相关文章推荐
- my sql
- oracle db_link的使用说明
- MySQL中临时表的基本创建与使用教程
- Mac上安装mysql遇到的坑
- zabbix监控mysql数据库的配置方法
- mysql myisam引擎压缩表
- 分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
- 用python操作redis数据库
- MySQL中describe命令的使用方法小结
- plsql 远程访问Oracle报错
- 夺命雷公狗---memcache NO:05 分布式的内存对象缓存系统的配置
- Mysql登录失败错误(10061)解决办法
- 使用rlwrap调用sqlplus中历史命令
- 夺命雷公狗---memcache NO:04 mencache在php下的使用语法
- 夺命雷公狗---memcache NO:03 start显示状态以及保存机制等
- MySQL触发器运用于迁移和同步数据的实例教程
- 理解SQLAlchemy的表继承关系(3)-Concrete Table Inheritance
- 夺命雷公狗---memcache NO:02 练习telnet语法
- Mysql查询优化——连接的技巧(一)
- 夺命雷公狗---memcache NO:01 环境的安装