Mysql 注意事項

1.exists和in的效率 引用:https://www.cnblogs.com/meibao/p/4973043.html

in的表為小表,exists為大表

-- 这条语句适用于a表比b表大的情况
select * from ecs_goods a where cat_id in(select cat_id from ecs_category);
-- 这条语句适用于b表比a表大的情况
select * from ecs_goods a where EXISTS(select cat_id from ecs_category b where a.cat_id = b.cat_id);

 

2.GROUP_CONCAT 和limit混合使用

GROUP_CONCAT 默認1024長度,多餘的將會被截取,limit不起作用

-- 查出來的長度1024碼
SELECT GROUP_CONCAT(a.msg_no)FROM
(
    SELECT msg_no
    FROM lrtdmsg
    WHERE (msg_to = 'D044211' AND msg_from = 'LxAssistant') AND td_no = ''
    UNION
    SELECT msg_no
    FROM lrtdmsg
    WHERE (msg_to = 'D044211' AND msg_from = 'LxAssistant') AND td_no = ''
) a
ORDER BY a.msg_no DESC LIMIT 15

-- 應改為

SELECT GROUP_CONCAT(a.msg_no)FROM
(
SELECT msg_no FROM 
(
    SELECT msg_no 
    FROM lrtdmsg
    WHERE (msg_to = 'D044211' AND msg_from = 'LxAssistant') AND td_no = '' 
    UNION
    SELECT msg_no 
    FROM lrtdmsg 
    WHERE (msg_to = 'D044211' AND msg_from = 'LxAssistant') AND td_no = '' 
) a 
ORDER BY a.msg_no DESC LIMIT 15
)a

3.exists和limit搭配使用,limit無效 exists有優先權
 

-- 查出來不是一筆而是很多筆  (msg_no唯一)
SELECT a.*
 FROM lrtdmsg a
 WHERE a.td_no = '6172'
 AND EXISTS(
   SELECT 1    FROM lrtdmsg X   WHERE (x.msg_from = 'LxAssistant' OR x.msg_to = 'D044211') AND x.td_no = '6172'
  AND x.msg_no = a.msg_no
 ORDER BY x.msg_no DESC LIMIT 1);

猜你喜欢

转载自blog.csdn.net/losedguest/article/details/88797899