[英]MySQL: efficient query on a column too long to be indexed
在我的MySQL數據庫中,我有一個字符串列( 例如 SHA哈希),該列增長得太長而無法放置索引。 如何針對此列運行有效的查詢?
N
字符上放置一個索引,但是使用此“部分”索引的查詢是什么樣的呢? N
字符創建第二列,並在其上放置一個完整的索引,作為“部分”索引的替代。 然后,我將查詢,獲取一個或多個記錄,並在內存中進行過濾的最后一步。 在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.