有没有办法确定某个查询是否需要索引?

Dum*_*ion 3 mysql

我想知道mysql(phpmyadmin) 中是否有一个命令来确定某个查询是否需要索引。

例如我有这样的查询:

SELECT name FROM table_name WHERE lastname = 'jobs' ORDER BY date_joined DESC
Run Code Online (Sandbox Code Playgroud)

然后,当我运行此查询,将会出现一个对话框,并说:“你可以添加indexcolumn_name提高速度”。

ype*_*eᵀᴹ 5

询问:

SELECT name
FROM table_name 
WHERE lastname = 'jobs' 
ORDER BY date_joined DESC ;
Run Code Online (Sandbox Code Playgroud)

索引:

  • (lastname)
    此类查询的普通索引,WHERE. 中列的简单索引。它涵盖了所有已经WHERE last_name = 'some_vale'并将非常有效的查询,假设条件足够“选择性”,即您没有数百万姓氏为“Jobs”的人:

  • (lastname, date_joined)
    一个稍微不同的索引,也有列ORDER BY。除了不需要排序之外,它的性能几乎与上述索引相同。在大多数情况下,这不太可能有帮助。

  • (lastname, date_joined, name)
    稍微好一点的索引,包含来自ORDER BYSELECT列表的列。它将比普通索引稍微高效一点,因为它完全“覆盖”了查询。它不需要任何排序,所有需要的值都将从索引中读取,而无需在主表中进行额外的查找。是否需要,取决于对效率的要求(将运行时间从 20 毫秒减少到 5 毫秒会有什么不同吗?)。
    但是,当查询更改时,例如通过在SELECT列表中添加另一列,情况不会更好。所以它是一个针对非常狭窄的情况的索引。

该怎么办?

作为结论,您很可能只需要一个简单的索引(last_name)

我需要索引吗?

是的,如果这些查询很常见,那么没有索引和有索引之间的区别就是全表扫描和索引查找(在表中进行一些额外的查找)之间的区别。
就复杂性而言,这是O(n)vs O(logn),其中 n 是表的大小,假设默认的 B 树索引。