Mysql - 解释键为空

标签 mysql query-optimization explain

在我的表格电子邮件

mysql> explain select * from Emails where email_id IN  (2029000006126024, 2029000004564319, 2029000000692079, 2029000004564202);
+----+-------------+---------------+------------+------+----------------------------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table         | partitions | type | possible_keys                          | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+---------------+------------+------+----------------------------------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | Emails        | NULL       | ALL  | Emails_FK1_IDX,Emails_IDX2             | NULL | NULL    | NULL | 785984 |    57.70 | Using where |
+----+-------------+---------------+------------+------+----------------------------------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

并且已经为“email_id”列创建了索引,但正在对整个表运行查询。

创建表查询是

CREATE TABLE `Emails` (
`EMAIL_REPORT_ID` bigint(19) NOT NULL,
`CAMPAIGN_EMAIL_ID` bigint(19) NOT NULL,
`SENT_DATE` bigint(19) DEFAULT NULL,
`EMAIL_ID` bigint(19) NOT NULL,
`BOUNCE` int(10) DEFAULT '0',
`BOUNCED_DATE` bigint(19) DEFAULT NULL,
`SPAM` tinyint(1) DEFAULT '0',
`OPT_OUT` tinyint(1) DEFAULT '0',
`IGNORED` int(10) DEFAULT '0',
`CMP_CONTENT_ID` bigint(19) DEFAULT NULL,
`RESTRICT` int(10) DEFAULT '0',
`TIME_ZONE` varchar(100) DEFAULT NULL,
`GMT_DEVIATION` varchar(10) DEFAULT NULL,
`CMP_COMMENTS_COUNT` int(10) DEFAULT '0',
`IGNORED_BY_TRAP` int(10) DEFAULT '0',
PRIMARY KEY (`EMAIL_REPORT_ID`),
KEY `Emails_FK1_IDX` (`CAMPAIGN_EMAIL_ID`),
KEY `Emails_FK2_IDX` (`CONTACT_ID`),
KEY `Emails_FK3_IDX` (`RECIPIENT_SELECTION_ID`),
KEY `Emails_FK4_IDX` (`CMP_CONTENT_ID`),
KEY `Emails_IDX1` (`SENT_DATE`),
KEY `Emails_IDX2` (`CAMPAIGN_EMAIL_ID`),
KEY `Emails_IDX3` (`EMAIL_REPORT_ID`,`CAMPAIGN_EMAIL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

请专家如何解决这个问题。

最佳答案

如果 MySQL 估计您搜索的值可能与表的大部分内容匹配,则它不会使用索引。

具体阈值没有记录,但根据我的经验,当您的查询与表的大约 20% 匹配时,优化器可以从查询逻辑中推断出这一点,它决定进行表扫描和过滤更有效输出它检查的行而不是使用索引。

如果您不同意,可以使用FORCE INDEX hint告诉优化器表扫描成本太高,如果有适用的索引,它应该更喜欢使用索引。

关于Mysql - 解释键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49513763/

相关文章:

mysql - 将登录页面从mysql数据库添加到swift

php - 如何从mysql数据创建图表? (使用谷歌可视化 API)

Mysql 更改查询计划类型

mysql - MVC3 - 无法将长文本输入数据库

php - 插入前检查数据库中是否存在元组数据

MySQL索引策略

php - MYSQL 优化 : Fetching Data w. r.t 一周中的某一天

sql - 优化使用日期进行过滤和连接的 SQL 查询

postgresql - 了解查询中的 COUNT 行为、EXPLAIN 与函数

mysql内连接查询运行缓慢