MySQL主键查询扫描5000x太多行
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL主键查询扫描5000x太多行,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2359字,纯文字阅读大概需要4分钟。
内容图文
![MySQL主键查询扫描5000x太多行](/upload/InfoBanner/zyjiaocheng/893/ea5dea3315164bd7ac33cc2a3805c8e4.jpg)
我正在尝试使用基于PRIMARY KEY的WHERE语句运行简单的SELECT查询.我在具有32个内核和30 GB RAM的GCE实例上运行MySQL 5.7.9. 500个分区中有大约300M的记录. 99.9999%的查询来自过去2天,并且该数据完全适合内存,经过验证后我看到从磁盘读取了~0个字节.我的CPU始终固定为100%,同时运行10-20个类似的查询.
我正在跟踪一些Google搜索数据,因此Requested,IsPriority和KeywordID的每个组合有100个排名.尽管我的主要索引是设计的,因此不需要扫描,当我查看EXPLAIN时,它显示正在扫描552k行以返回100行.
平均而言,需要20-40秒才能从RAM返回100行,这些行由主键直接指向.我该怎么做才能加快这个查询?
EXPLAIN EXTENDED SELECT * FROM data.Rankings
-> WHERE Requested = '2016-02-26 00:00:00' AND NOT IsPriority AND KeywordID = '7387777811691965572'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: Rankings
partitions: p20160226
type: ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 552598
filtered: 1.00
Extra: Using where
1 row in set, 2 warnings (0.01 sec)
这是DB表
CREATE TABLE `Rankings` (
`KeywordID` char(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`Requested` timestamp NOT NULL,
`IsPriority` tinyint(1) NOT NULL,
`Retrieved` timestamp NOT NULL,
`Rank` tinyint(4) NOT NULL,
`Source` varchar(5) COLLATE utf8mb4_unicode_ci NOT NULL,
`ExternalID` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL,
`Phrase` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
// another 40 data columns of varying types
PRIMARY KEY (`Requested`,`IsPriority`,`KeywordID`,`Rank`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED
// I have about 500 daily partitions over the last 1.5 years
/*!50100 PARTITION BY RANGE ( UNIX_TIMESTAMP(Requested))
(PARTITION p20160222 VALUES LESS THAN (1456185600) ENGINE = InnoDB,
PARTITION p20160223 VALUES LESS THAN (1456272000) ENGINE = InnoDB,
PARTITION p20160224 VALUES LESS THAN (1456358400) ENGINE = InnoDB,
PARTITION p20160225 VALUES LESS THAN (1456444800) ENGINE = InnoDB,
PARTITION p20160226 VALUES LESS THAN (1456531200) ENGINE = InnoDB,
PARTITION p20160227 VALUES LESS THAN (1456617600) ENGINE = InnoDB,
PARTITION p20160228 VALUES LESS THAN (1456704000) ENGINE = InnoDB,
PARTITION p20160229 VALUES LESS THAN (1456790400) ENGINE = InnoDB) */;
解决方法:
我怀疑NOT导致了问题.如何使用相等比较?
SELECT *
FROM data.Rankings
WHERE Requested = '2016-02-26 00:00:00' AND
IsPriority = 0 AND
KeywordID = '7387777811691965572';
内容总结
以上是互联网集市为您收集整理的MySQL主键查询扫描5000x太多行全部内容,希望文章能够帮你解决MySQL主键查询扫描5000x太多行所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。