Dud*_*ude 5 mysql performance index query-performance
您如何设置用于列比较的索引,例如WHERE col1 > col2
?
col1
并且col2
是 DATETIME 类型。
假设表的布局如下:
CREATE TABLE mytable
(
id int not null auto_increment,
col1 datetime,
col2 datetime,
primary key (id)
);
Run Code Online (Sandbox Code Playgroud)
您可能想尝试以下两件事之一
创建列并填充如下
ALTER TABLE mytable ADD COLUMN dtdiff INT NOT NULL;
ALTER TABLE mytable ADD INDEX (dtdiff);
UPDATE mytable SET dtdiff = UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2)l
Run Code Online (Sandbox Code Playgroud)
如果您的表没有外键或约束,请改为执行以下操作:
CREATE TABLE mytable_new LIKE mytable;
ALTER TABLE mytable_new ADD COLUMN dtdiff INT NOT NULL;
ALTER TABLE mytable_new ADD INDEX (dtdiff);
INSERT INTO mytable_new
SELECT id,col1,col2,
UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2)
FROM mytable
;
ALTER TABLE mytable RENAME mytable_old;
ALTER TABLE mytable_new RENAME mytable;
DROP TABLE mytable_old;
Run Code Online (Sandbox Code Playgroud)
完成后,您的查询基本上将
SELECT * FROM mytable WHERE dtdiff > 0
为了col1 > col2
SELECT * FROM mytable WHERE dtdiff < 0
为了col1 < col2
CREATE TABLE mytable_dtdiff
(
id int not null,
dtdiff int not null,
primary key (id),
key dtdiff (dtdiff)
);
INSERT INTO mytable_dtdiff
SELECT id,UNIX_TIMESTAMP(col1) - UNIX_TIMESTAMP(col2)
FROM mytable;
Run Code Online (Sandbox Code Playgroud)
完成后,您的查询基本上将
SELECT B.* FROM
(SELECT id FROM mytable_dtdiff WHERE dtdiff > 0) A
LEFT JOIN mytable B USING (id);
Run Code Online (Sandbox Code Playgroud)
对于col1 > col2
和
SELECT B.* FROM
(SELECT id FROM mytable_dtdiff WHERE dtdiff < 0) A
LEFT JOIN mytable B USING (id);
Run Code Online (Sandbox Code Playgroud)
为了col1 < col2
试一试 !!!