2017-07-06 90 views
1

我有試圖從這樣一個表中讀取所有行的腳本:MySql的COUNT(*)併發查詢超慢

select count(*) from table where col1 = 'Y' or col1 is null; 

col1和col2上沒有索引與此查詢通常需要約20秒,但如果某人已經在運行此查詢,則需要等待數年並被阻止。

我們在表中只有大約100k行,我試過它沒有where子句,它會導致相同的問題。

該表使用InnoDB,所以它不存儲確切的計數,但我很好奇,如果有任何併發​​參數,我應該看看。我不確定在桌面上沒有索引會導致問題,但對我來說沒有意義。

謝謝!

回答

1

如果它們未被編入索引,則需要讀取表中的整個磁盤文件才能找到您的數據。單個硬盤不能很好地執行併發讀取密集型操作。你必須索引。

+0

我看着磁盤讀寫和他們看起來非常平坦。這是否意味着它在極限? – instanceOfObject

+0

您嘗試編制索引嗎? – Fabien

0

它看起來像你的SELECT COUNT(*)...查詢正在序列化與您的表上的其他操作。除非你另外告訴MySQL服務器,否則你的查詢將盡最大努力做到非常精確。

嘗試通過在查詢之前立即發出此命令來更改transactionisolation level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

設置這使得所謂髒讀,這意味着你可能不能指望在操作過程中更改表的一切。但是這可能不會讓你的應用程序太糟糕。

(添加合適的索引始終是一個好主意,但不是你問這個問題的原因。)