我有一個包含三列的表。第一列,定義為varchar型別,是客戶的號碼 ( c_number),另外兩列也是型別varchar- 客戶的名字和姓氏 (c_first_name和c_last_name)。
該表沒有單獨的主鍵。但是在同一列中存在重復c_number(例如,對于相同的客戶,但名字和姓氏寫在不同的暫存器中)。
表中的行數相當大——大約一百萬。
需要顯示所有重復次數大于N次的客戶。
這是正面解決問題的代碼:
SELECT *
COUNT(c_number) AS c
GROUP BY
c_number
HAVING
(c > N) ;
但是這種方法似乎很慢。我的解決方案是添加索引:
CREATE INDEX idx_c_number
ON TABLENAME(c_number);
之后,如果我理解正確,就可以執行運算式來實時搜索重復項。
如果仍然不是這種情況,請告訴我找到具有最佳性能的重復項的最佳解決方案(記住我們仍然沒有主鍵這一事實)。
uj5u.com熱心網友回復:
實際上,“一百萬條記錄”不再被認為是“大”......
是的,索引將使您能夠使用您所描述的查詢,并在速度上有合理的提高。 “但是,要付出代價……”
雖然有些人認為在表上設定主鍵是“必要的”或至少是“習慣的”,但這完全取決于您。例如,一些表基本上只是“事件或事務日志”,您永遠不會使用“主鍵”來參考它們。如果你永遠不會使用一個,你就不需要一個。它不會以任何方式影響“索引”。
現在,通過創建此索引,您將引入長期成本:此后必須維護該索引。這將給插入或洗掉記錄或更新索引值的任何事物帶來額外成本。因此,雖然這當然會使當前查詢“更快”,但它不是免費的。“相應地計劃。” 只有您可以決定什么是最適合您的。由于影響更大,我鼓勵您在繼續之前與您的同事討論此事。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536556.html
