改进选择查询

Bir*_* ZA 3 mysql performance optimization query-performance

我今天在接受新工作的面试时被问到一个关于SELECT查询的问题:

SELECT lastname FROM users WHERE name='John';
Run Code Online (Sandbox Code Playgroud)

SELECT查询将运行超过一百万行。

我被问到:你如何使它更快/更有效?

我没有答案,一些谷歌搜索也没有向我透露任何信息。

我知道这个问题被关闭的可能性很高,但我真的很想知道您如何使该查询运行得更快。有任何想法吗?

ype*_*eᵀᴹ 14

该表可能有一百万、十亿或一万亿行。答案是一样的:

WHERE(和其他子句) 中使用的列上添加适当的索引。

在这种情况下,一个简单的索引就(name)足够了。假设匹配条件的行数name = 'John'很小,比如 0.1%,那么优化器将使用索引来查找匹配的行,然后只从表中读取这些行(这是通过一些额外的查找完成的),以找到该lastname值。

对于非常大的表,这可能不够快。如果匹配行的百分比是 0.1%,有 10 亿行,这意味着有 100 万行name = 'John'和 100 万次查找。然后我们可以有一个“覆盖”索引 - on (name, lastname)- 所以我们不必在表上进行额外的查找。将仅使用索引,并且将通过简单的索引查找(和部分扫描)找到数百万个值。

回复您的评论

据我所知,这与更改表结构并将名称列设置为索引一样简单。正确的?

基本上是的,无论是ALTER TABLE ... ADD INDEX ...还是CREATE INDEX ...表结构并没有真正改变,索引是一个额外的(物理)结构。