對 VARCHAR(512) 的 url 欄位建立索引時出現警告:
ALTER TABLE article ADD INDEX ind_article_url(url); -- Warning: Specified key was too long; max key length is 767 bytes
MySQL 自動建立 url(383) 前綴索引(GBK 雙位元組,383×2=766 位元組)。
| 字元集 | 單字元位元組 | 最大索引字元數 | 驗證 SQL |
|---|---|---|---|
| latin1 | 1 | 767 | CREATE TABLE t(c VARCHAR(767) PRIMARY KEY) CHARSET=latin1 成功 |
| GBK | 2 | 383 | VARCHAR(383) 成功,384 失敗 |
| UTF-8 | 3 | 255 | VARCHAR(255) 成功,256 失敗 |
註:MySQL 5.7+ 配合 innodb_large_prefix=ON 可放寬至 3072 位元組。
-- 全欄位選擇性 SELECT COUNT(DISTINCT url)/COUNT(*) FROM article; -- 0.0750 -- 不同前綴長度選擇性對比 SELECT COUNT(DISTINCT LEFT(url,76))/COUNT(*) AS url_76, COUNT(DISTINCT LEFT(url,77))/COUNT(*) AS url_77, ... COUNT(DISTINCT LEFT(url,85))/COUNT(*) AS url_85 FROM article;
結果顯示:85 字元時選擇性 0.0750 已接近全欄位,無需使用預設 383 字元。
ALTER TABLE article ADD INDEX ind_article_url(url(85))ORDER BY url、GROUP BY url 無法使用前綴索引,會觸發 Using filesortEXPLAIN SELECT id, url, deleted FROM article GROUP BY url; -- type=ALL, Extra=Using temporary; Using filesort