2015-03-31 49 views
0

我用40K左右行下面的表格有慢:MySQL查詢速度快於一個系統,在另一

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.2s內,並與運行XAMPP:

的MySQL版本14.14 DISTRIB 5.6.20,爲Win32(86)

然而,當在Mac Pro上精確複製一份完全相同的查詢時,需要幾分鐘的時間(已驗證:結構,索引和引擎都是th Ë相同)運行MAMP有:

的MySQL版本14.14 DISTRIB 38年5月5日,使用osx10.6(I386)EditLine包裝

我甚至嘗試了多種不同的客戶端...

任何想法如何查詢可以是如此慢,即使一切都/似乎是相同的?

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); 
+1

如果你在每個系統上做了EXPLAIN,結果是否一樣?你最近在兩個系統上重建了索引嗎? – Kickstart 2015-03-31 12:25:08

+0

@Kickstart感謝您的信息! 'EXPLAIN'顯示相同。不過,我想,在現有的表上創建一個索引(使用CREATE INDEX)實際上會構建索引。我還發現InnoDB不支持[REPAIR](https://dev.mysql.com/doc/refman/5.0/en/repair-table.html),所以我現在正在嘗試'mysqldump'方法。 – Domi 2015-03-31 13:05:10

+0

這個問題似乎並不是實際的索引,而是MySQL用來決定使用哪些索引的統計數據。這個其他答案可能有幫助 - http://stackoverflow.com/questions/321461/when-should-database-indexes-be-rebuilt – Kickstart 2015-03-31 13:38:10

回答

1

IN (SELECT ...)曾經有過糟糕的表現。通常可以通過將其修復爲JOIN來「修復」它。問題是每當需要IN時,SELECT都會重新執行。

In 5.6.5,優化器做了更奇特的事情。您可以通過執行EXPLAIN EXTENDED SELECT ...然後SHOW WARNINGS來查看「更改」。

+0

剛剛測試過它。使用'INNER JOIN'而不是'IS IN',使查詢在93ms內執行。注意到版本之間的這種細微差別;這是相當有見識的,謝謝! - 哦,我也意外地解開了你的編輯並重新編輯了我的問題,但是這似乎有一個錯誤,那就是在這種情況下它不會再委任你。 - 抱歉!隨意,做另一個編輯:) – Domi 2015-04-02 16:29:54

+0

很高興聽到它運行得很快。 93ms vs 0.2s意味着JOIN加快了速度;這是有趣的知道。感謝您的跟進。沒問題(關於編輯);無論如何,修訂歷史記錄顯示細節。 – 2015-04-02 21:22:21

+0

對不起! 93毫秒來自Mac Pro,它比Windows PC要快200ms。所以我只是雙重檢查,結果是:JOIN更快。在Windows PC上(較新的MySQL版本),'IS IN'需要150到220ms,'JOIN'版本需要90到150ms。注:我只重複了幾次查詢,並記錄了查詢次數;對性能測試來說不是一個非常可靠的設置。 – Domi 2015-04-03 08:15:09

相關問題