最近做性能优化时,通过开启 MySQL 的慢日志查询配置,发现 有一条慢sql,在这里记录下分析和优化的过程。 该慢sql 如下: select id from fucdn_customer_domain where id not in (select customer_domain_id from fucdn_customer_domain_cache where cache_time > 0) and status = 1 通过explain 或 desc 查看...
WHERE t1.c1 NOT IN ("A","B","C") 但是数据量过大时这么做会有问题,这时候需要EXISTS函数 WITHtable1AS(SELECT"A"c1UNIONSELECT"B"c1UNIONSELECT"C"c1UNIONSELECT"D"c1),table2AS(SELECT"A"c1UNIONSELECT"B")SELECT*FROMtable1t1WHEREEXISTS(SELECT1FROMtable2WHEREc1=t1.c1)...
for(记录1 in 左表){ for(记录2 in 右表){ 记录1 join 记录2 }} 所以时间复杂度O(n*m); 由于被驱动表需要被遍历n次,所以查询优化器进行了优化, 使用`join buffer` 将被驱动表缓存起来,从而提升检索速度; (2) join字段 被驱动表上建立索引 在左外连接的场景下,由于驱动表所有数据都要,因此可以接受...
WHERE LOC_IN IN (10,20,30); 1. 2. 3. 3.18 避免在索引列上使用IS NULL和IS NOT NULL 避免在索引中使用任何可以为空的列, 3.19 总是使用索引的第一个列 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 3.20 用UNION-ALL 替换UNION ( ...
因为not in不走索引,所以不在不得已情况下,就不要使用not in 下面使用 join 来替代not in 做查询 select ID from A where ID not in (select ID from B) 替换为 select A.ID from A left join B on A.ID=B.ID and B.ID is null 或者: ...
Mysql 中 not in 的查询优化 本文为博主原创,转载请注明出处: 最近做性能优化时,通过开启 MySQL 的慢日志查询配置,发现 有一条慢sql,在这里记录下分析和优化的过程。 该慢sql 如下: selectidfromfucdn_customer_domainwhereidnotin(selectcustomer_domain_idfromfucdn_customer_domain_cachewherecache_time>0)and...
查询(取rec_id )。假设满足 a.* from record a where a.id not in(select b.rec_id from offline_record);条件的记录一共有N条,那么,最坏情况下,该算法所做的查询次数为:2W(取record.id)+2W*4W(每取一次record.id就要取一次offline_record.rec_id且offline_record的最后一条数据满足...
MySql如何使用notin实现优化 MySql如何使⽤notin实现优化 最近项⽬上⽤select查询时使⽤到了not in来排除⽤不到的主键id⼀开始使⽤的sql如下:select s.SORT_ID, s.SORT_NAME, s.SORT_STATUS, s.SORT_LOGO_URL, s.SORT_LOGO_URL_LIGHT from SYS_SORT_PROMOTE s WHERE ...
(SELECT id FROM biz_customer_incoming WHERE cid='315upfdv34umngfrxxxxxx'); 我们从这么一个问题来引入接下来的内容,如果你知道答案就不用继续看下去了。 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略。 1. 对于 IN、=ANY 子查询,优化器有如下策略选择: ...