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 ...
表结构并没有真正改变,索引是一个额外的(物理)结构。