我正在使用MySQL與innodb在Rails中的應用程序。我需要經常抓取整個表的數量,我知道使用innodb,計算表中的所有記錄可能會非常昂貴,因爲它需要全表掃描。我正在查看軌道控制檯中的典型表格,並查看計數記錄的查詢時間。到目前爲止,我發現第一次計算記錄需要很長時間,但在後續的嘗試中速度要快得多。例如:在mysql innodb表中計數記錄
2.2.2 :002 > Request.count
(683.7ms) SELECT COUNT(*) FROM `requests`
=> 260588
2.2.2 :003 > Request.count
(47.6ms) SELECT COUNT(*) FROM `requests`
=> 260588
2.2.2 :004 > Request.count
(46.7ms) SELECT COUNT(*) FROM `requests`
=> 260588
因此,首先,我是否需要擔心優化此結果?計數可能被Rails或mySql或InnoDB緩存,沒有什麼可擔心的。
我打算假設在任何給定時間多個用戶正在寫入表的生產環境中仍然有些問題需要擔心。在那種情況下,我如何「重置」高速緩存或是什麼讓我對計數時間有一種虛幻的陽光看法,以便我可以做一些誠實的基準測試?我嘗試寫入記錄,或者只是用reload!
重新載入控制檯,但我從來沒有得到最初的時間。我敢打賭,如果我退出控制檯並重新啓動將執行此操作的mysql,但我寧願不必努力工作。
最後,我聽說類似下面的查詢將運行得更快:
select count(*) from requests use index(<index_name>);
好像用最自然的指數是id
場。
select count(*) from service_requests use index(id)
但是這給了我以下錯誤:
ERROR 1176 (42000): Key 'id' doesn't exist in table 'requests'
但ID不只是一個鍵,它的主鍵。在一些表格上,它是唯一的索引。爲什麼id不被視爲一個關鍵?
你也可以使用FORCE INDEX(PRIMARY) – cp50