【发布时间】:2016-03-04 07:52:28
【问题描述】:
我的第一个attempt 在一个问题上被证明是令人困惑的,我收到了一些混杂的答案(可能是由于我的问题令人困惑)。这是一个不同的更好的问题...
假设我的表在 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 这样的查询会更好吗?
【问题讨论】:
-
我想复合索引在搜索名字和姓氏的情况下会更快。但请注意,仅对姓氏的搜索不能使用 (first,last) 上的索引
-
但是有人告诉我,在复合索引中的 last_name 上使用通配符(尾随)会使复合索引的其余部分无用(右侧的列)。
-
查询将只使用一个索引。优化器将选择最具选择性的索引。
-
@RichardSmith 索引合并怎么样?
-
@prograhammer 我已经尝试过 AND 和 OR,但我无法哄它使用索引合并(无论如何在 5.6 上)。它用 AND 选择一个索引。我看不出索引合并对您的查询有何帮助。也许是时候升级到 5.7
标签: mysql indexing wildcard query-performance composite-key