记一次mysql 执行查询语句卡死的问题

背景

两张表里面都有上亿条数据, 写了一条左联的查询语句, 比如这样

select a.city, b.value from tablea as a left join tableb as b on a.cid = b.cid where a.source = 10

然后语句执行就卡死了,
实际上这条语句在tablea 只有30条数据, 在tableb没有数据,
然后用 explain 查看语句也走索引了, 只查了几百行
用 SHOW PROCESSLIST 查看发现语句处于 sending data
那么问题来了, 为啥呢…

问题原因

通过查询发现, 因为是之前的老数据, 比较脏, 所以在a表里 cid 竟然会有为null和空的数据, 然后众所周知, 字段为null时是会影响索引的…两张表都有上亿的数据, 你们懂得

字段为null 走不走索引

很多人都默认感觉不走, 但经测试其实是走的, 但是, 在某种情况下是不走的

is null   走索引
is not null 走索引
is not null or is null  不走索引

emmmm 我难道是触发到这个了? 但确实是这个为null数据的问题

问题解决

知道问题就很简单了, where 语句加一个 is not null 就可以了(ps: 表不是我们的, 所以也不方便改表, 建议建表都加默认值)

你可能感兴趣的:(数据库)