我对数据库优化,索引有疑问。我有一个叫做“项目”的表,我将执行这样的查询:
订购查询
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%的项目处于活动状态。
答案 0 :(得分:3)
您需要考虑活动索引的选择性。
如果您的项目中有极少数项目处于活动状态:
(active)
如果您的项目中只有相对较少的项目处于活动状态,但表格非常大:
(active, created)
(active, project_deadtime)
(active, project_allowedtime)
如果大部分项目可以同时处于活动状态:
(created)
(project_deadtime)
(project_allowedtime)
更新:根据您提供的新信息,我会选择最后一个选项。虽然有这么小的表,即使没有索引,排序也应该接近即时。另一种方法是将第三个选项修改为覆盖索引。
答案 1 :(得分:3)
最常使用哪些查询?有多少行?哪些查询需要最快?您是否运行了SELECT
个或更多INSERT
个?在调整数据库性能方面有很多考虑因素。
仅根据您发布的内容,您只使用以下列:
完全基于active
的索引不会有什么好处 - 它可能会将结果缩小到一半左右。
其他列是每个潜在的指数。如果您不关心INSERT
的性能与SELECT
的性能有关,我会说三个索引,优先考虑可能将查询范围缩小到最少的列行:
如果只使用第一列,这将允许MySQL使用索引(例如,如果只需要created
)或如果使用两列(更进一步缩小结果) )。