【问题标题】:MySQL Index Structure: multiple or single index?MySQL索引结构:多索引还是单索引?
【发布时间】:2011-02-28 00:31:10
【问题描述】:

我对数据库优化、索引有疑问。我有一个名为“项目”的表,我将执行如下查询:

排序查询

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 雇主 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 的项目处于活动状态。

【问题讨论】:

  • 您的表最多大约有多少行?任何时候最多有多少活跃项目?
  • projects 表最多有 1000-2000 行。 SELECT 查询性能很重要,大约 %90 的项目处于活动状态。

标签: sql mysql indexing


【解决方案1】:

最常使用哪些查询?会有多少行?哪些查询需要最快?你跑更多SELECTs 还是更多INSERTs?调优数据库性能有很多注意事项。

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

  1. 有效
  2. 已创建
  3. project_deadtime
  4. project_allowedtime

仅在 active 上的索引不会有什么好处——它可能会将结果缩小到大约一半。

其他列是每个潜在的索引。如果您不像SELECTs 那样关注INSERTs 的性能,我会说索引所有三个,优先考虑可能将查询范围缩小到最少行的列:

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

如果只使用第一列(例如,如果只需要created),这将允许 MySQL 使用索引。如果同时使用两列(进一步缩小结果范围)。

【讨论】:

  • projects 表最多有 1000-2000 行。 SELECT 查询性能很重要,大约 %90 的项目处于活动状态。
【解决方案2】:

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

  • 如果您的项目在任何时候都处于活动状态:

    (active)
    
  • 如果在任何时候只有相对少量的项目处于活动状态,但表格非常大:

    (active, created)
    (active, project_deadtime)
    (active, project_allowedtime)
    
  • 如果大部分项目可以同时活跃:

    (created)
    (project_deadtime)
    (project_allowedtime)
    

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多