我试图在使用Mysql时更好地理解索引。一个问题是我仍然很难确定我应该使用哪种类型的索引,例如单个索引,多列索引,覆盖索引等。
我遇到的一个问题是,是否有一般规则来决定使用哪种类型的索引?当我设计我的数据库布局时,我不知道在构建应用程序之前将使用所有查询的确切内容。对于一个表,我可以在一个或多个字段上查询以及查询它以进行报告。所以,如果我像这样查询一个表:
SELECT * FROM table1 WHERE field1 = this AND field2 = that GROUP BY field3 ORDER BY field4
我会在field1,field3,field3和field4上创建多列索引吗?
如果我在同一个表上有不同的查询,例如:
,该怎么办?SELECT * FROM table1 WHERE field1 = this and field3 = that
如果我从第一个查询获得多列索引,那么第二个查询的相同索引是否有效,因为field1位于索引的最左边?
我的另一个问题是mysql是否有特定的命令查找索引?那么对于多列或覆盖索引,我是否按照where子句的顺序添加索引?然后在group子句中的任何内容然后在order子句中的任或者mysql会自动执行此操作吗?
对不起所有问题,只是寻求帮助。
答案 0 :(得分:2)
首先,您必须确定要为给定表格使用哪个引擎
(全文索引根据列中的单词保留索引)
您必须知道MySQL在 join 中每个表最多只使用一个索引。所以,不要指望MySQL组合给定表的两个索引。
根据查询选择列的顺序,前提是MySQL可以在必要时使用索引的顶部
例如
CREATE INDEX myindex ON mytable (col1,col2,col3)
MySQL可以使用(col1),(col1,col2)和(col1,col2,col3)作为索引。所以要回答你的问题,你的索引应该在
上创建 (field1,field3,field2,field4).
因为您的两个查询需要(field1,field3)和(field1,field2,field3,field4)。
答案 1 :(得分:2)
当我设计我的数据库布局时,我不确切知道在构建应用程序之前将使用的所有查询
正确。在知道所有查询之前,不要构建索引。可以添加,更改,更改和删除索引。实际上,优秀的设计师会随着软件的使用而改变索引。
我会在field1,field3,field3和field4上创建多列索引吗?
很少。
如果我从第一个查询获得多列索引,那么第二个查询的相同索引是否有效,因为field1位于索引的最左边?
没有
我遇到的另一个问题是mysql是否有特定的命令查找索引?
没有
那么对于多列或覆盖索引,我是否按照where子句的顺序添加索引?
没有
然后在group子句中的任何内容然后在order子句中的任何内容?
没有
或者mysql会自动执行此操作吗?
更多或更少。
这是规则。
设计数据库。
撰写查询。
查找最常见的查询。 20%的查询可以完成80%的工作。关注需要索引的少数慢查询。
仅解释最常见查询的查询执行计划。对此有一个EXPLAIN
声明。
使用实际数据加载来衡量这些查询的性能。你必须为此建立假数据。有些查询会很慢。索引可能帮助。有些查询不会很慢。
现在是困难的部分。尝试不同的索引,直到(a)解释计划看起来最佳,(b)测量的查询性能符合您的期望。
您无法让所有查询变得更快。
您没有为所有查询构建索引。
关注20%的查询,这些查询占80%的时间。