Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql数据库组合关键问题_Mysql_Sql_Indexing_Database Indexes - Fatal编程技术网

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);