[英]UNION DISTINCT faster than OR on 9 million records?
我有一個帶有+-900萬條記錄的InnoDB表。
我曾經有這樣的查詢
SELECT
my_primary_key
FROM
my_table
WHERE
col1 = 1 AND
col2 = 2 AND
(col3 = 'aaa' OR col4 = 'bbb' OR col5 = 'ccc')
我的表結構:
CREATE TABLE IF NOT EXISTS `my_table` (
`my_primary_key` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`col1` tinyint(1) unsigned NOT NULL DEFAULT '0',
`col2` tinyint(1) unsigned NOT NULL DEFAULT '0',
`col3` varchar(255) NOT NULL,
`col4` varchar(255) NOT NULL,
`col5` varchar(255) NOT NULL,
PRIMARY KEY (`my_primary_key`),
KEY `col1` (`col1`),
KEY `col2` (`col2`),
KEY `col3` (`col3`),
KEY `col4` (`col4`),
KEY `col5` (`col5`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
根據我朋友的建議,我嘗試將其更改為
SELECT my_primary_key FROM my_table WHERE col1 = 1 AND col2 = 2 AND col3 = 'aaa'
UNION DISTINCT
SELECT my_primary_key FROM my_table WHERE col1 = 1 AND col2 = 2 AND col4 = 'bbb'
UNION DISTINCT
SELECT my_primary_key FROM my_table WHERE col1 = 1 AND col2 = 2 AND col5 = 'ccc'
但是,當我嘗試查看正在運行的查詢時,我發現“時間”仍然很高(介於8到20秒之間)
SHOW FULL PROCESSLIST
通過使用UNION DISTINCT,我是否走在正確的道路上? 還是有其他更快的方法來執行查詢?
謝謝。
我認為or
通常來說最快。 但是,它似乎需要全表掃描。 您可以在(col1, col2, col3, col4, col5, my_primary_key)
上嘗試使用復合索引,該索引可能會代替掃描而被使用。
如果每個子句都可以使用索引並且返回的行相對較少,則union distinct
將更快。 因此,請嘗試使用以下索引運行它:
mytable(col1, col2, col3, my_primary_key)
mytable(col1, col2, col4, my_primary_key)
mytable(col1, col2, col5, my_primary_key)
在優化中,您嘗試避免進行全表掃描。 union distinct
可以通過正確的索引來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.