2010-06-04 94 views
1

我有关于数据库优化,索引的问题。我有表名为 “项目”,我会执行这样的疑问:MySQL索引结构:多个或单个索引?

订购查询

SELECT * FROM项目active = 1的ORDER BY创建

SELECT * FROM WHERE活动项目= 1个ORDER BY project_deadtime

SELECT * FROM WHERE活性= 1个ORDER BY project_allowedtime项目

我的表Stuct URE像这样

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
活性TINYINT(1)NO MUL NULL

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

编辑:项目表将有最大1000-2000行。 SELECT查询性能很重要,大约90%的项目处于活动状态。

+0

您的桌子最多有多少行?大致来说,任何时候活动项目的最大数量是多少? – 2010-06-04 22:30:38

+0

项目表将有最多1000-2000行。 SELECT查询性能很重要,大约90%的项目处于活动状态。 – mTuran 2010-06-05 00:26:43

回答

3

哪些查询最常用?会有多少行?哪些查询需要最快?你跑更多SELECT s或更多INSERT s?在调整数据库性能方面有很多考虑因素。

仅基于你张贴的东西,你只使用了下列:

  1. 活跃
  2. 创建
  3. project_deadtime
  4. project_allowedtime

索引只在active将没有什么好处 - 它可能会缩小到约一半的结果。

其他列是每个潜在的指标。如果你不为关注的INSERT S作为的SELECT S中的性能表现,我想说指数三个,到有可能缩小查询到最少行列优先:

  1. (创建,激活)
  2. (project_deadtime,活性)
  3. (project_allowedtime,活性)

这将允许MySQL使用索引如果只有第一列被使用(例如,如果只created需要)如果使用了两列(甚至进一步缩小结果)。

+0

项目表将有最多1000-2000行。 SELECT查询性能很重要,大约90%的项目处于活动状态。 – mTuran 2010-06-05 00:27:44

3

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

  • 如果你的项目中有极少数活跃在任何时间:

    (active) 
    
  • 如果只有你的项目的数量相对较少的是在任何时候激活,但该表是非常大的:

    (active, created) 
    (active, project_deadtime) 
    (active, project_allowedtime) 
    
  • 如果项目相当大的比例可以在同一时间被激活:

    (created) 
    (project_deadtime) 
    (project_allowedtime) 
    

更新:根据您所提供的新的信息,我会去的最后一个选项。尽管有这样一张小桌子,即使没有索引,排序也应该是即时的。另一种选择是将第三个选项修改为覆盖索引。