加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

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

执行计划为:

  1. +----+--------------------+-------+------+-----+------------------------------------------+---------+-------+---------+ -----+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  3. +----+--------------------+-------+------+ -----+------------------------------------------+---------+-------+---------+ -----+ 
  4. | 1 | PRIMARY | n | ALL | | NULL | NULL | NULL | 1086041 | Using where | 
  5. | 1 | PRIMARY | sra | ref | | idx_user_id | 123 | const | 1 | Using where | 
  6. | 2 | DEPENDENT SUBQUERY | m | ref | | idx_message_info | 122 | const | 1 | Using index condition; Using where | 
  7. +----+--------------------+-------+------+ -----+------------------------------------------+---------+-------+---------+ -----+ 

去掉 exists 更改为 join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。

  1. SELECT * 
  2. FROM my_neighbor n  
  3.  INNER JOIN message_info m  
  4.  ON n.id = m.neighbor_id  
  5.  AND m.inuser = 'xxx'  
  6.  LEFT JOIN my_neighbor_apply sra  
  7.  ON n.id = sra.neighbor_id  
  8.  AND sra.user_id = 'xxx'  
  9. WHERE n.topic_status < 4  
  10.  AND n.topic_type <> 5  

新的执行计划:

  1. +----+-------------+-------+--------+ -----+------------------------------------------+---------+ -----+------+ -----+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  3. +----+-------------+-------+--------+ -----+------------------------------------------+---------+ -----+------+ -----+ 
  4. | 1 | SIMPLE | m | ref | | idx_message_info | 122 | const | 1 | Using index condition | 
  5. | 1 | SIMPLE | n | eq_ref | | PRIMARY | 122 | ighbor_id | 1 | Using where | 
  6. | 1 | SIMPLE | sra | ref | | idx_user_id | 123 | const | 1 | Using where | 
  7. +----+-------------+-------+--------+ -----+------------------------------------------+---------+ -----+------+ -----+ 

6、条件下推

外部查询条件不能够下推到复杂的视图或子查询的情况有:

  • 聚合子查询;
  • 含有 LIMIT 的子查询;
  • UNION 或 UNION ALL 子查询;
  • 输出字段中的子查询;

如下面的语句,从执行计划可以看出其条件作用于聚合子查询之后:

  1. SELECT *  
  2. FROM (SELECT target,  
  3.  Count(*)  
  4.  FROM operation  
  5.  GROUP BY target) t  
  6. WHERE target = 'rm-xxxx'  
  1. +----+-------------+------------+-------+---------------+-------------+---------+-------+------+-------------+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
  3. +----+-------------+------------+-------+---------------+-------------+---------+-------+------+-------------+ 
  4. | 1 | PRIMARY | <derived2> | ref | <auto_key0> | <auto_key0> | 514 | const | 2 | Using where | 
  5. | 2 | DERIVED | operation | index | idx_4 | idx_4 | 519 | NULL | 20 | Using index | 
  6. +----+-------------+------------+-------+---------------+-------------+---------+-------+------+-------------+ 

(编辑:厦门网)

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

热点阅读