簡體   English   中英

MySQL:對無法索引的列進行有效查詢

[英]MySQL: efficient query on a column too long to be indexed

在我的MySQL數據庫中,我有一個字符串列( 例如 SHA哈希),該列增長得太長而無法放置索引。 如何針對此列運行有效的查詢?

  • 我可以在該列的前N字符上放置一個索引,但是使用此“部分”索引的查詢是什么樣的呢?
  • 我可以用N字符創建第二列,並在其上放置一個完整的索引,作為“部分”索引的替代。 然后,我將查詢,獲取一個或多個記錄,並在內存中進行過濾的最后一步。
  • 我可以使用全文搜索功能 ,但隨后需要使用MyISAM。 MyISAM不支持ACIDity,因此不,謝謝。

在MySQL中實現此目標的正確方法是什么?

問題不在於減少列的大小或重新配置數據庫(如果它配置的密鑰長度太短)。 它是不費吹灰之力地利用部分索引或類似索引的方法,最好不要給應用程序造成負擔或彈出其他列。

在我的特殊情況下,我正在UTF8表的兩列上尋找復合鍵:

create table fingerprinted_item (
  type varchar (512) not null,
  fingerprint varchar (512) not null,
  primary key (fingerprint, type)
);

-- Then there may be a child table.

MySQL說:

[42000][1071] Specified key was too long; max key length is 767 bytes

在其他服務器上,最大密鑰長度為1000個字節。

真正的問題可能是將VARCHAR用於指紋列。 當使用utf8字符編碼時,MySQL強制執行“最壞情況”並每個字符計數3個字節。

可以將其更改為1字節編碼(例如Latin1),或者改用VARBINARY類型:

create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (512) not null,
  PRIMARY KEY(type, fingerprint)) ENGINE InnoDB; -- no error here

如果必須超出每個前綴767字節的限制,則在創建索引時必須明確聲明:

create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (2048) not null,              -- 2048 bytes
  PRIMARY KEY(type, fingerprint(767))) ENGINE InnoDB; -- only the first 767 bytes of fingerprint are stored in the index

http://bugs.mysql.com/bug.php?id=6604

嘗試這個:

ALTER TABLE `mytable` ADD UNIQUE ( yourcolumn(1000))

播放最后一個參數。

暫無
暫無

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

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