我的第一個attempt在一個問題被證明是令人困惑,我收到了一些混合的答案(可能是由於我的混淆問題)。這裏有一個不同的,更好的問題...使用尾隨通配符搜索first_name和last_name的最佳索引?
假設我的表看起來像這樣在MySQL:
CREATE TABLE `people` (
`person_id` INT(11),
`alias_num` TINYINT(3),
`first_name` VARCHAR(255) NOT NULL,
`last_name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`person_id`,`alias_num`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;
隨着數據是這樣的:
person_id alias_num first_name last_name
--------- --------- ---------- ---------
1 1 John Smith
2 1 Joe Smith
3 1 Bill Smith # <-- Notice this guy has 3 aliases
3 2 Billy Smith # <--
3 3 William Smith # <--
4 1 Susan Thompson
...
假設jo
和smi
被輸入到HTML搜索表單(需要兩個字段),我的查詢將始終如此:
SELECT person_id FROM people WHERE first_name LIKE 'jo%' AND last_name LIKE 'smi%';
問題:添加到我的表中以使上述查詢最快的最佳索引是什麼?
注: 我做的將近一百萬行的表中的一些快速測試,它看起來像first_name(15)
和last_name(15)
是2個獨立的指標似乎比使用SQL_NO_CACHE的last_name(15),first_name(15)
複合索引快?但也許我正在測試這個錯誤。我也在考慮,也許綜合索引和單個名稱上的索引組合會很好(如果這不會混淆優化器)?
獎勵題:
考慮到我在尋找局部的話,不完全的話,會像ElasticSearch爲此查詢的更好嗎?
我想象一下,在搜索名字和姓氏時,組合索引會更快。但請注意,姓氏搜索只能使用(第一個,最後一個)索引 – Strawberry
但我被告知在複合索引中對last_name使用通配符(尾隨)會使複合索引的其餘部分無用(右邊的列)。 – prograhammer
該查詢將只使用一個索引。優化器將選擇最具選擇性的索引。 –