【问题标题】:Mysql - Explain key is nullMysql - 解释键为空
【发布时间】:2018-09-05 21:56:39
【问题描述】:

在我的表格电子邮件中

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 

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

【问题讨论】:

  • 发布SHOW CREATE TABLE Emails的结果
  • 我没有发布完整的查询,还有其他信息吗?
  • 请立即找到我的问题。
  • 嗯?查询引用了email_id,但表中不存在该列??

标签: mysql query-optimization explain


【解决方案1】:

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

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

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

【讨论】:

  • 但是每次我都会添加强制索引查询,我不想要这个
  • @Aaryan - 多少百分比的行实际上与 email_ids 列表匹配?
  • 50% 的行
  • @Aaryan,如果您不想使用索引提示,那么您必须接受优化器的计划。你只有这两个选择! :-)
  • @BillKarwin 同意优化器的计划,如何优化它
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 2019-03-19
  • 1970-01-01
  • 2011-06-02
  • 2012-02-17
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多