簡體   English   中英

如何在 mysql innodb 中保存 varchar 字段以提高查詢性能

[英]How to save varchar field for query performance in mysql innodb

我制作了以下示例表。

CREATE TABLE `User` (
  `userId` INT(11) NOT NULL AUTO_INCREMENT,
  `userKey` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`userId`),
  UNIQUE KEY (`userKey`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我想要快速查詢userKey字段。 為了做到這一點,除了索引,我還應該考慮什么?

  • 例如,在保存userKey時,使用 DATE(sortable value) 之類的值作為前綴是否更有利於搜索速度?
  • 或者,如果我將 userKey 保存為 hash 值,它會改善嗎?

您已將userKey聲明為UNIQUE ,因此 MySQL 將自動為您創建索引。 這通常應該足夠了,因為您正在通過“完全匹配”或“開始於”類型的查詢進行搜索。

如果您考慮存儲 hash 值,您將只能執行“完全匹配”查詢。 但是,對於可能被證明不值得的短字符串。 此外,對於散列,您需要考慮沖突的風險。 如果您使用較小的 hash 值(例如 4 個字節),則風險會增加。 這些只是一些指導方針。 如果不深入了解您的案例的更多細節,就不可能提供明確的解決方案。

加快桌子速度的一種方法是擺脫它。

構建從小於 20 字符的字符串到 4 字節的 INT 的映射不會節省太多空間。 擺脫查找可以節省一點時間。

如果您需要做“正確的事情”,每個字符串都有一個副本以避免冗余,那么您所擁有的可能是最好的。

如果有更多的列,那么可能會有輕微的改進。 但首先,回答這個問題:您是否經常通過 UserKey 進行查找而不是通過 UserId 進行查找?

我給 Hash 一個響亮的 NO。 (如果字符串太大而無法索引,這可能是必要的。)

BTree 在執行“點查詢”時非常有效。 FROM User WHERE UserId = 123FROM User WHERE UserKey = 'xyz' )。 添加日期或 hash 只會使其變慢。

暫無
暫無

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

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