【发布时间】:2022-01-18 11:08:17
【问题描述】:
作为高负载系统中数据库优化的新手,我有以下问题 - 假设我们有以下查询(查询带有示例数据):
SELECT *
FROM ticket
WHERE ticket_status='draft'
AND user_id='789437879'
ORDER BY ticket_id DESC LIMIT 0, 15
我们已经有以下索引:
CREATE INDEX ticket_status on ticket(ticket_status);
CREATE INDEX user_id on ticket(user_id);
CREATE INDEX ticket_id on ticket(ticket_id);
如果我们执行以下操作,优化此查询是否会显着提高性能:
CREATE INDEX make_that_query_more_efficient on ticket(user_id,ticket_status);
还是因为所有列都被索引了,所以几乎没有什么区别?
【问题讨论】:
-
一个 user_id 有多少张票?
-
可以是一个,也可以是数千个。
-
一个表副本只能使用一个索引。您可以按每个单独的列创建索引 - 但只能使用其中一个。 如果我们执行以下操作,优化此查询是否会带来显着的性能优势也许很有可能。还通过
(user_id, ticket_status, ticket_id)测试索引。 -
这个问题的问题在于,我们无法提前告诉您使用多列索引是否会获得显着的性能提升!这取决于您的数据(索引中附加列的选择性以及还有多少记录需要按第 3 列排序)。显着这个词也是模糊的,我们认为显着的,你可能不认为显着。对你来说最好的方法是测试它:在你的开发环境中获取相似的大小和特征数据,并用单列索引和多列索引测试性能,你就会知道答案
-
请阅读 Marcus Windand 的 use-the-index-luke.com 。
标签: mysql sql performance indexing query-optimization