[英]MySQL query on medium-sized table fast on one system, slow on another
我有大約40k行的下表:
CREATE TABLE IF NOT EXISTS `log_ui_activity` (
`uiActivityLogEntryId` INTEGER UNSIGNED auto_increment ,
`uid` INTEGER UNSIGNED,
`from` DATETIME,
`duration` INTEGER UNSIGNED,
`nCharactersTyped` INTEGER UNSIGNED,
`nClicks` INTEGER UNSIGNED,
`hadOtherInteractions` INTEGER UNSIGNED,
`currentPage` TEXT,
`currentPageArgs` TEXT,
`currentPageStateInfo` TEXT,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NOT NULL,
PRIMARY KEY (`uiActivityLogEntryId`)
) ENGINE=InnoDB;
具有兩個附加索引,每個索引都位於createdAt
和uid
。
當我運行以下查詢時:
SELECT *
FROM log_ui_activity
WHERE `createdAt` IN (
SELECT MAX(`createdAt`) FROM log_ui_activity
GROUP BY uid);
它在Windows 7上以0.2秒的時間完成,並通過以下方式運行XAMPP:
適用於Win32(x86)的MySql Ver 14.14 Distrib 5.6.20
但是,在運行MAMP的Mac Pro上對數據的精確副本運行完全相同的查詢(已驗證:結構,索引和引擎都相同)時,需要花費幾分鍾。
使用EditLine包裝器的osx10.6(i386)的MySql Ver 14.14 Distrib 5.5.38
我什至嘗試了不同的客戶...
有什么想法可以使查詢慢得多,即使所有內容/看起來都一樣?
UPDATE
如答案中所建議,使用JOIN
代替IS IN
解決問題。 供參考,這是JOIN
語句:
SELECT *
FROM log_ui_activity a
INNER JOIN (
(SELECT MAX(`createdAt`) createdAt FROM log_ui_activity GROUP BY uid) tmp
)
ON (a.createdAt = tmp.createdAt);
IN ( SELECT ... )
曾經有糟糕的表現。 您通常可以通過將其變成JOIN
來“修復”它。 問題在於,每次需要IN
時, SELECT
都會重新執行。
在5.6.5中 ,優化器做得更好。 通過執行EXPLAIN EXTENDED SELECT ...
,然后SHOW WARNINGS
,可以看到“更改”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.