MySQL之优化查询

4 篇文章 0 订阅
一、将WHERE条件移入ON后面是不恰当的。推荐的做法是: ON只进行连接操作,WHERE只过滤中间表的记录。
下面总结一下两表连接查询选择方式的依据:
 1、 查两表关联列相等的数据用内连接。 
 2、 Col_L是Col_R的子集时用右外连接。 
 3、 Col_R是Col_L的子集时用左外连接。 
 4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
 5、 求差操作的时候用联合查询
 
 内连接:INNER JOIN  等价于 , where
 左连接:LEFT JOIN
 右链接:RIGHT JOIN
 完全连接:FULL JOIN (不支持)
 MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
left join + union(可去除重复数据)+ right join

 hash join,merge join,neatst loop 这三种链接方式。?
 子查询和左连接查询那种效率更好?(最好用数据说话)
 1、一说大数据用左连接查询,数据量小查询都差不多,但要从长远考虑。
2、如果子查询仅仅查询符合逻辑存在判断的语法,那效率远远高于连接查询。比如:exist,in
 结论:大数据左连接查询效率高于子查询(亲测)。
 
 二、
 SELECT COUNT(1) FROM (
SELECT a.SXH AS sxh FROM k_sfmx a GROUP BY a.SXH
) a #1
SELECT COUNT(DISTINCT a.SXH) AS sxh FROM k_sfmx a #2
#1的查询效率高与2的查询效率

三、
 #发现有锁表等待的线程;显示哪些线程正在运行
 show processlist;
#通过命令查看慢查询:解决方式:kill掉慢SQL进程,索引添加立刻完成
select * from information_schema.processlist where command not in ('Sleep')  
and user not in ('mydba','event_scheduler','repl','binlogbak','system user');
 #获取到一些关键的信息点,死锁等情况说明
show engine innodb status;
show status;
 mysql查看锁表方法
 SHOW OPEN TABLES WHERE in_use > 0;
 
 MYSQL中IN比FIND_IN_SET性能高。我们要查询的字段是主键或索引时,使用IN时会使用索引,只会查询表中部分数据。如果查询条件是常量用IN,如果是变量用FIND_IN_SET。
 修改操作时如果使用索引会导致表中被操作的这行数据被锁定(行锁)。不使用索引的数据库操作获取到的锁会导致整个表的锁定(表锁)。
 
  like'str ',like'str%' 等都能够使用索引.
SELECT * from base_ypxx WHERE LOCATE('胶',`YPMC`)>0;#0.081s
SELECT * from base_ypxx WHERE POSITION('胶' IN `YPMC`)>0;#0.081s
SELECT * from base_ypxx WHERE INSTR(`YPMC`, '胶' )>0 ;#0.08s
SELECT * from base_ypxx WHERE YPMC LIKE "胶%";#0.079s 会走索引
SELECT * from base_ypxx WHERE YPMC LIKE CONCAT("%","胶","%");#0.079s 不走索引

MYSQL之SUM函数:SUM(expr)函数如果表达式没有数据,那么返回的结果就会为空。
1、SELECT IFNULL(SUM(expr),0)
2、SELECT COALESCE(SUM(expr),0) 
3、 SELECT CASE WHEN ISNULL(SUM(expr)) THEN 0 ELSE SUM(expr) END  
4、if(result == null){result=0} else{ return result;} 
    or if(result instanceof Integer){return result} else{return 0;}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值