列比较上的 MySQL 索引

Dud*_*ude 5 mysql performance index query-performance

您如何设置用于列比较的索引,例如WHERE col1 > col2

col1并且col2是 DATETIME 类型。

Rol*_*DBA 3

假设表的布局如下:

CREATE TABLE mytable
(
    id int not null auto_increment,
    col1 datetime,
    col2 datetime,
    primary key (id)
);
Run Code Online (Sandbox Code Playgroud)

您可能想尝试以下两件事之一

想法#1:创建一个列来存储秒数差异

创建列并填充如下

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

想法#2:创建一个单独的表来存储秒数差异

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

试一试 !!!