簡體   English   中英

UNION DISTINCT比9百萬條記錄的OR更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM