mysql - 为什么 MySQL 总是选择 "is NULL"列索引而不是 "JOIN"列索引?

标签 mysql sql indexing query-optimization

stackoverflow 上已经回答了许多问题,这些问题讨论了 SQL 如何通过使用表上的各种统计信息并估计每个索引的帮助程度来选择索引。我希望通过一个更具体的问题,有人能够准确地阐明这如何适用于我的情况。

查询的内容如下:

SELECT *
FROM TableA
LEFT JOIN TableB
  on TableB.data_id = TableA.data_id
  and TableB.customer_id is NULL
WHERE TableB.id is NULL

TableB.idTableB.customer_id 上有一个索引。 MySQL 数据库不断选择使用 TableB.customer_id 上的索引。这会导致查询运行缓慢,而如果我强制它使用 TableB.id 上的索引,则速度会很快。

TableATableB 都有 100,000 - 1,000,000 行,并且其中许多行都匹配。 TableB.customer_id 几乎全部为 NULL。

在这种情况下,MySQL 选择 customer_id 上的索引是否有特定原因?

is NULL 子句与 = TableA.id 子句相比,有什么东西让它认为这会更有用吗?

我本以为它会选择 id 上的索引,因为这是与另一个表进行比较的列,并且它是需要特定值的列,而不仅仅是 NULL 与 NOT空。

最佳答案

TableB.id 上的索引与以下内容无关

 on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL

相反,有这个复合索引:

INDEX(data_id, customer_id)

关于mysql - 为什么 MySQL 总是选择 "is NULL"列索引而不是 "JOIN"列索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52193196/

相关文章:

MySQL - 如何快速插入百万行?

c# - 如何在运行时访问(或生成)NHibernate Sql

php - 将数据库输出插入特定的 div 标签

php - MySQL 关联表 COUNT() 和 GROUP BY

java - JDBC 领域找不到 mysql 驱动程序

sql - 在 Hive 中查询

mysql - DateTime 按日期和小时分组

postgresql - postgres 中相对于其他行的部分唯一索引

MySQL 在索引 TIMESTAMP 列上使用文件排序

python - 使用散列从数据框中删除列