我对为表创建索引感到非常困惑。
假设一个表users有 5 列,id(主键)、name、email、创建日期和更新日期。
id | name | email | creation_date | update_date
Run Code Online (Sandbox Code Playgroud)
最初的问题是关于为所有列创建索引(多列索引)。这通常是个好主意吗?(显然对于列数较少的表)
我知道您可能会问这取决于查询,但让我们假设以下查询:
1. SELECT * FROM users where creation_date < 'A DATE'
2. SELECT id, email from users where name = 'SOME NAMES';
3. SELECT id, email from users where name = 'SOME NAMES' ORDER BY creation_date DESC;
4. SELECT id, email from users where name = 'SOME NAMES' AND creation_date >= 'SOME DATES' ORDER BY updated_date ASC;
Run Code Online (Sandbox Code Playgroud)
我打算避免的是为上面的每个查询创建多个索引。那么我们是否可以创建一个由所有列组成的多列索引来覆盖上面的所有查询呢?
网络中分散信息的下一个问题是关于索引中列的顺序。这与 WHERE 子句后面的参数相同吗?ORDER BY 怎么样?我们需要在多列索引中考虑这一点吗?
以下答案是针对 MySQL 的。
最初的问题是关于为所有列创建索引(多列索引)。这通常是个好主意吗?(显然对于列数较少的表)
不,不是。
如果表具有多列索引,则优化器可以使用索引的任何最左边的前缀来查找行。
例如,如果您在 (name,email,creation_date) 上有一个三列索引,则您就具有 (name)、(name, email) 和 (name,email,creation_date) 上的索引搜索功能。
我打算避免的是为上面的每个查询创建多个索引。那么我们是否可以创建一个由所有列组成的多列索引来覆盖上面的所有查询呢?
没有任何一个多列索引可以涵盖以上所有查询。
网络中分散信息的下一个问题是关于索引中列的顺序。这与 WHERE 子句后面的参数相同吗?
是的。例如,如果您有where name = 'SOME NAMES' AND creation_date >= 'SOME DATES' ORDER BY updated_date ASC
该索引也应该(name ,creation_date ,updated_date)涵盖下一个问题的最后部分。
| 归档时间: |
|
| 查看次数: |
2453 次 |
| 最近记录: |