上執行的方式對非索引列的查詢將導致O(n),因爲它必須搜索整個表。由於二分查找,添加索引允許O(log n)。有沒有辦法讓數據庫使用哈希表使用的相同技術(或者另一種方法)來實現O(1),如果你正在尋找一個唯一的密鑰?是否有數據庫查詢在O(1)
2
A
回答
2
在某些情況下,某些rdbms支持基於哈希的索引。例如,MySQL支持語法CREATE INDEX indexname USING HASH ON tablename (cols…)
,但前提是指定的表存儲在內存中,而不是存儲在磁盤上。聚簇表是一種特殊情況。
我猜對於在rdbms中廣泛使用散列索引的主要原因是它們擴展性差。由於磁盤I/O的價格昂貴,因此非常薄的索引將需要大量的I/O,以獲得較少的信息收益。因此,您寧願選擇人口密度較高的索引(例如,始終將填充部分保留在⅓和⅔之間),這在散列衝突方面可能會有問題。但更具問題的是:當你插入值時,這樣一個密集的索引可能會變得太滿,你必須經常增加哈希表的大小。這樣做意味着會完全重建散列表。這是一個昂貴的操作,它需要大量的磁盤I/O,並且可能會阻塞該表上的所有併發查詢。不值得期待。
另一方面,B樹可以擴展而沒有太多的開銷。即使增加其深度(這是散列表大小的擴展最接近的模擬),也可以更便宜地完成,並且將不太經常需要。由於B樹往往很淺,而且由於磁盤I/O往往會超出你在內存中做的任何事情,所以它們仍然是大多數實際應用的首選解決方案。更不用說他們提供廉價訪問值的範圍,這對於散列來說是不可能的。
相關問題
- 1. 查詢Android數據庫是否存在!
- 2. O(1)是否可以訪問數據庫行?
- 3. 是否更快做24個數據庫查詢或1數據庫查詢和排序在PHP?
- 4. 是否有任何限制WindowsInstaller msi數據庫查詢在sql
- 5. Oracle查詢檢查所有活動查詢的I/O消耗數據庫
- 6. Django的查詢集 - 打在O DB(1)
- 7. 無效的數據庫查詢是否比有效數據庫慢? (MySQL的)
- 8. android SQLite數據庫查詢1
- 9. 在查詢「SELECT 1 ...」中使用「LIMIT 1」是否有意義?
- 10. 查詢檢查訪問數據庫中是否存在表
- 11. Mysql查詢檢查數據庫中是否存在url
- 12. 如何查詢postgreSQL數據庫來檢查值是否存在?
- 13. 檢查數據庫中是否存在使用查詢> NodeJS
- 14. 是否有可能查詢存儲在Android SQLite數據庫中的JSON數據
- 15. 檢查數據庫是否有記錄
- 16. 是否有任何數據庫支持相互遞歸查詢
- 17. LINQ查詢是否返回數據庫中的所有記錄?
- 18. 聚合查詢是否有專門的數據庫?
- 19. 查詢Firebase用戶是否檢查數據庫中是否存在聯繫人
- 20. 通過sqlite查詢核心數據數據庫是否安全
- 21. 該查詢是否正確地從數據庫檢索數據?
- 22. 檢查查詢是否存在並獲得結果(1查詢)
- 23. 數據庫SQL查詢 - #1242 - 子查詢返回多個1
- 24. 查詢codeigniter插入只有1在數據庫中的位DB數據類型
- 25. 檢查項中是否存在項目由O設置(1)
- 26. 字典查詢(O(1))與Linq其中
- 27. MySQL檢查數據庫是否存在
- 28. 檢查是否在數據庫
- 29. 檢查是否在數據庫
- 30. chechbox檢查是否值在數據庫
您是在問一個特定的數據庫,還是這只是對如何實現數據庫的普遍好奇心?後者似乎更適合於計算機科學網站,而不是SO。 – Barmar
沒有什麼能夠阻止你使用散列表而不是樹來實現數據庫索引。但它只對精確匹配很有用,而不用LIKE或關係比較匹配前綴(< and >)。 – Barmar
羣集索引大多數是你可以做的最好的,通常也在O(log n)查找時間(儘管明顯比非羣集更快)。 O(1)肯定是可行的,但不夠實用,數據庫設計者認爲這是一個好主意。 – Dukeling