我想知道mysql
(phpmyadmin) 中是否有一个命令来确定某个查询是否需要索引。
例如我有这样的查询:
SELECT name FROM table_name WHERE lastname = 'jobs' ORDER BY date_joined DESC
Run Code Online (Sandbox Code Playgroud)
然后,当我运行此查询,将会出现一个对话框,并说:“你可以添加index
到column_name
提高速度”。
询问:
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 BY
和SELECT
列表的列。它将比普通索引稍微高效一点,因为它完全“覆盖”了查询。它不需要任何排序,所有需要的值都将从索引中读取,而无需在主表中进行额外的查找。是否需要,取决于对效率的要求(将运行时间从 20 毫秒减少到 5 毫秒会有什么不同吗?)。
但是,当查询更改时,例如通过在SELECT
列表中添加另一列,情况不会更好。所以它是一个针对非常狭窄的情况的索引。
该怎么办?
作为结论,您很可能只需要一个简单的索引(last_name)
。
我需要索引吗?
是的,如果这些查询很常见,那么没有索引和有索引之间的区别就是全表扫描和索引查找(在表中进行一些额外的查找)之间的区别。
就复杂性而言,这是O(n)
vs O(logn)
,其中 n 是表的大小,假设默认的 B 树索引。