我用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;
與另外兩個指標,對每一個和createdAt
uid
。
當我運行以下查詢:
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);
如果你在每個系統上做了EXPLAIN,結果是否一樣?你最近在兩個系統上重建了索引嗎? – Kickstart 2015-03-31 12:25:08
@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
這個問題似乎並不是實際的索引,而是MySQL用來決定使用哪些索引的統計數據。這個其他答案可能有幫助 - http://stackoverflow.com/questions/321461/when-should-database-indexes-be-rebuilt – Kickstart 2015-03-31 13:38:10