加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

你不会还在用这8个错误的SQL写法吧?

发布时间:2019-09-22 04:23:24 所属栏目:MySql教程 来源:Java架构师追风
导读:1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT* FROMoperation WH

确定从语义上查询条件可以直接下推后,重写如下:

  1. SELECT target,  
  2.  Count(*)  
  3. FROM operation  
  4. WHERE target = 'rm-xxxx'  
  5. GROUP BY target 

执行计划变为:

  1. +----+-------------+-----------+------+---------------+-------+---------+-------+------+--------------------+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  3. +----+-------------+-----------+------+---------------+-------+---------+-------+------+--------------------+ 
  4. | 1 | SIMPLE | operation | ref | idx_4 | idx_4 | 514 | const | 1 | Using where; Using index | 
  5. +----+-------------+-----------+------+---------------+-------+---------+-------+------+--------------------+ 

7、提前缩小范围

先上初始 SQL 语句:

  1. SELECT *  
  2. FROM my_order o  
  3.  LEFT JOIN my_userinfo u  
  4.  ON o.uid = u.uid 
  5.  LEFT JOIN my_productinfo p  
  6.  ON o.pid = p.pid  
  7. WHERE ( o.display = 0 )  
  8.  AND ( o.ostaus = 1 )  
  9. ORDER BY o.selltime DESC  
  10. LIMIT 0, 15  

该SQL语句原意是:先做一系列的左连接,然后排序取前15条记录。从执行计划也可以看出,最后一步估算排序记录数为90万,时间消耗为12秒。

  1. +----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+----------------------------------------------------+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  3. +----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+----------------------------------------------------+ 
  4. | 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 909119 | Using where; Using temporary; Using filesort | 
  5. | 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | o.uid | 1 | NULL | 
  6. | 1 | SIMPLE | p | ALL | PRIMARY | NULL | NULL | NULL | 6 | Using where; Using join buffer (Block Nested Loop) | 
  7. +----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+----------------------------------------------------+ 

由于最后 WHERE 条件以及排序均针对最左主表,因此可以先对 my_order 排序提前缩小数据量再做左连接。SQL 重写后如下,执行时间缩小为1毫秒左右。

  1. SELECT *  
  2. FROM ( 
  3. SELECT *  
  4. FROM my_order o  
  5. WHERE ( o.display = 0 )  
  6.  AND ( o.ostaus = 1 )  
  7. ORDER BY o.selltime DESC  
  8. LIMIT 0, 15 
  9. ) o  
  10.  LEFT JOIN my_userinfo u  
  11.  ON o.uid = u.uid  
  12.  LEFT JOIN my_productinfo p  
  13.  ON o.pid = p.pid  
  14. ORDER BY o.selltime DESC 
  15. limit 0, 15 

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读