簡體   English   中英

在一個系統上,對中型表的MySQL查詢速度很快,而在另一個系統上,MySQL查詢速度慢

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

具有兩個附加索引,每個索引都位於createdAtuid

當我運行以下查詢時:

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.

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