mysql数据库组合关键问题
我们有一个数据库,其中的数据表定义如下:mysql数据库组合关键问题,mysql,sql,indexing,database-indexes,Mysql,Sql,Indexing,Database Indexes,我们有一个数据库,其中的数据表定义如下: 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) REFE
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 );
数到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 );
任何帮助都将不胜感激 您的查询被重写以更改where子句的顺序,如下所示
SELECT COUNT(msts)
from data
where variable_id=107
and p_id=661
and msts>1535796060000000000
and msts<1535886000000000000;
如果它已经包含数十亿行,您可能应该创建一个具有正确定义的新表,将现有表复制到其中。然后复制数据。然后将旧表重命名为
data\u old
或其他名称,并将新表重命名为data
。这可能是一项涉及批量数据的复杂任务;如果你想不出来,可以问另一个问题。提示:如果你有机会在代码中描述应该如何做,请告诉卢卡斯。再次感谢,谢谢你,O·琼斯。那么,这是否涉及将主键中的顺序更改为:(variable_id,p_id,msts)?我要试一试!非常感谢@kitt91-计划A重新安排PK。。计划B添加一个包含这3列的二级索引。这两种方法都需要花费10亿行的时间B'将消耗大量额外的磁盘空间。另一个@O.Jones-谢谢,这成功了!相当大的速度提高到几分之一秒!再次感谢
rows = 190996998
filtered=0
ref=NULL
type=range
SELECT COUNT(msts)
from data
where variable_id=107
and p_id=661
and msts>1535796060000000000
and msts<1535886000000000000;
ALTER TABLE data
DROP PRIMARY KEY,
ADD PRIMARY KEY (variable_id, p_id, msts);