关于索引和mysql的一般问题

时间:2011-01-29 03:52:29

标签: mysql performance database-design indexing

我试图在使用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会自动执行此操作吗?

对不起所有问题,只是寻求帮助。

2 个答案:

答案 0 :(得分:2)

  • 引擎

首先,您必须确定要为给定表格使用哪个引擎

  1. InnoDB更可取(交易...)但不提供全文索引
  2. 如果您需要全文索引,则必须选择MyISAM
  3. (全文索引根据列中的单词保留索引)

    您必须知道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会自动执行此操作吗?

更多或更少。

这是规则。

  1. 设计数据库。

  2. 撰写查询。

  3. 查找最常见的查询。 20%的查询可以完成80%的工作。关注需要索引的少数慢查询。

  4. 仅解释最常见查询的查询执行计划。对此有一个EXPLAIN声明。

  5. 使用实际数据加载来衡量这些查询的性能。你必须为此建立假数据。有些查询会很慢。索引可能帮助。有些查询不会很慢。

  6. 现在是困难的部分。尝试不同的索引,直到(a)解释计划看起来最佳,(b)测量的查询性能符合您的期望。

  7. 您无法让所有查询变得更快。

    您没有为所有查询构建索引。

    关注20%的查询,这些查询占80%的时间。