【发布时间】:2019-04-13 05:07:28
【问题描述】:
我们有一个数据库,其中的数据表定义如下:
CREATE TABLE data
(
msts BIGINT,
variable_id INT,
p_id INT,
value DOUBLE,
PRIMARY KEY(msts,variable_id,p_id)
);
ALTER TABLE data
ADD FOREIGN KEY (p_id)
REFERENCES p(id);
ALTER TABLE data
ADD FOREIGN KEY (variable_id)
REFERENCES variables(id);
这个表可以包含数十亿条记录。
进行简单查询时:
SELECT COUNT(msts) from data FORCE INDEX(PRIMARY) where (
msts<1535886000000000000 AND msts>1535796060000000000 AND
variable_id=107 AND p_id=661 );
屈服:
+-------------+
| COUNT(msts) |
+-------------+
| 89873 |
+-------------+
1 row in set (42.51 sec)
计算 89873 需要 42.51 秒。
为什么要花这么长时间才能看到主键应该充当复合索引?
这是解释:
EXPLAIN SELECT COUNT(msts) from data FORCE INDEX(PRIMARY) where
( msts<1535886000000000000 AND msts>1535796060000000000 AND
variable_id=107 AND plant_id=661 );
给出:
rows = 190996998
filtered=0
ref=NULL
type=range
任何帮助将不胜感激!
【问题讨论】:
-
提示:范围扫描
-
感谢 Lukasz 有机会在代码中描述它应该如何完成。再次感谢。
标签: mysql sql indexing database-indexes