MySQL索引结构:多个还是单个索引?

时间:2010-06-04 22:20:46

标签: sql mysql indexing

我对数据库优化,索引有疑问。我有一个叫做“项目”的表,我将执行这样的查询:

订购查询

SELECT * FROM projects WHERE active = 1 ORDER BY created

SELECT * FROM projects WHERE active = 1 ORDER BY project_deadtime

SELECT * FROM projects WHERE active = 1 ORDER BY project_allowedtime

我的表格结构

id int(11)NO PRI NULL auto_increment employer_id int(11)NO MUL NULL
project_title varchar(100)NO MUL NULL
project_description文本NO NULL
project_budget int(11)NO NULL
project_allowedtime int(11)NO NULL
project_deadtime日期NO NULL
创建日期时间NO MUL NULL
active tinyint(1)NO MUL NULL

我应该创建哪些列索引以及如何(单列或多列索引?)。例如,我应该使用active-created& active-project_deadtime& active-project_allowedtime多个索引还是单个活动索引就足够了?感谢

编辑:项目表最多可包含1000-2000行。 SELECT查询性能非常重要,约有90%的项目处于活动状态。

2 个答案:

答案 0 :(得分:3)

您需要考虑活动索引的选择性。

  • 如果您的项目中有极少数项目处于活动状态:

    (active)
    
  • 如果您的项目中只有相对较少的项目处于活动状态,但表格非常大:

    (active, created)
    (active, project_deadtime)
    (active, project_allowedtime)
    
  • 如果大部分项目可以同时处于活动状态:

    (created)
    (project_deadtime)
    (project_allowedtime)
    

更新:根据您提供的新信息,我会选择最后一个选项。虽然有这么小的表,即使没有索引,排序也应该接近即时。另一种方法是将第三个选项修改为覆盖索引。

答案 1 :(得分:3)

最常使用哪些查询?有多少行?哪些查询需要最快?您是否运行了SELECT个或更多INSERT个?在调整数据库性能方面有很多考虑因素。

仅根据您发布的内容,您只使用以下列:

  1. 活性
  2. 创建
  3. project_deadtime
  4. project_allowedtime
  5. 完全基于active的索引不会有什么好处 - 它可能会将结果缩小到一半左右。

    其他列是每个潜在的指数。如果您不关心INSERT的性能与SELECT的性能有关,我会说三个索引,优先考虑可能将查询范围缩小到最少的列行:

    1. (已创建,已启用)
    2. (project_deadtime,active)
    3. (project_allowedtime,active)
    4. 如果只使用第一列,这将允许MySQL使用索引(例如,如果只需要created如果使用两列(更进一步缩小结果) )。