簡體   English   中英

慢的MySQL SELECT查詢

[英]Slow MySQL SELECT query

我的MySQL SELECT查詢緩慢,似乎無法解決問題。

這是一個簡單的表,有大約60萬條記錄。

SELECT * 
FROM  `civicrm_contact` contact
WHERE contact.external_identifier =123456

Select查詢需要3到6秒鍾的時間,這使得導入另外60萬條依賴於此查詢的記錄是完全不切實際的。

表索引如下圖所示: 表索引

如果我基於contact.id = 123456進行搜索,那么查詢時間將減少到大約0.004s。 contact.id是表上的主鍵。 external_identifier是唯一索引。

我知道這是一個老話題,但是由於它與CiviCRM有關,所以我認為我會提出自己的想法。 實際上,此修復方法不是最佳實踐,因為您已經更改了核心打包表之一,以使查詢運行更快。 盡管這對您來說可以,但我絕對不會向所有人推薦。

您的解決方案可能已突出顯示了查詢的問題,似乎您是在告訴查詢您希望有一個數字,但實際上數據是作為VARCHAR存儲的。 因此,我認為僅將單引號引起來就可以解決問題?

SELECT * FROM civicrm_contact contact WHERE contact.external_identifier ='123456'

沒有這個,我非常確定(與Oracle一起工作了很多年)將進行隱式數據類型轉換,因此查詢將無法使用INDEX。

一個解釋計划應該證明這一理論。

謝謝

帕爾韋茲

看來您使用的是BTREE索引。 如果您不對此列執行任何范圍查詢(使用<><=>= ),則可能要使用基於哈希的索引。

有關詳細信息,請參見B樹和哈希索引比較

在這里看到確切的語法。

我將結構更改為使external_identifier的類型為INT而不是VARCHAR。 速度提高至0.006s

我不確定這是否會有更廣泛的含義

我懷疑數據類型轉換是問題。 我想知道這是否與索引字段的大小限制有關。 成為btree意味着索引鍵可能比哈希鍵大得多。 這有必要嗎? 將外部ID存儲在單獨的表中並根據數字ID進行鏈接會更好嗎?

實際問題多於答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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