数据库
首页 > 数据库> > MySQL索引帮助-哪个更快?

MySQL索引帮助-哪个更快?

作者:互联网

我正在处理的是:

我有一个使用ActiveCollab 2的项目,而数据库结构对我来说是新的-几乎所有内容都存储到project_objects表中,并且具有递归层次关系:

>记录1234可能是类型为“ Ticket”的parent_id为123
>记录123的类型可能是parent_id为12的“类别”
>记录12可能是键入“里程碑”,依此类推.

当前,该表中有多达450,000条记录,并且代码中的许多查询都引用了没有索引的名称字段.示例值可能是“设计”或“开发”.

这可能是一个示例查询:

SELECT * FROM project_objects类型=“ Ticket”和名称=“ Design”

我的问题:

我有一个查询需要花费12-15秒以上的时间,我有一种感觉
名称列缺少索引,需要全文搜索.我对索引的理解是,如果我在name字段中添加一个,则会加快读取速度,但会降低插入和更新速度.每次添加或更新记录时是否都需要完全重建索​​引,还是只是更改/附加了索引?我不想用索引来优化此查询,如果这意味着极大地减慢依赖更快写入的代码库其他部分的速度.

我的问题:

假设每天有100次读取和100次写入,这对于MySQL来说可能是更快的过程-在没有索引的情况下对上表执行上述查询,或者每次添加记录时都必须重建索引吗?

我不具备开始运行基准测试的知识或权限,但是我想向客户提供建议而又不完全是新手.谢谢!

编辑:这是表:

'CREATE TABLE `project_objects` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `source` varchar(50) DEFAULT NULL,
  `type` varchar(30) NOT NULL DEFAULT ''ProjectObject'',
  `module` varchar(30) NOT NULL DEFAULT ''system'',
  `project_id` int(10) unsigned NOT NULL DEFAULT ''0'',
  `milestone_id` int(10) unsigned DEFAULT NULL,
  `parent_id` int(10) unsigned DEFAULT NULL,
  `parent_type` varchar(30) DEFAULT NULL,
  `name` varchar(150) DEFAULT NULL,
  `body` longtext,
  `tags` text,
  `state` tinyint(4) NOT NULL DEFAULT ''0'',
  `visibility` tinyint(4) NOT NULL DEFAULT ''0'',
  `priority` tinyint(4) DEFAULT NULL,
  `created_on` datetime DEFAULT NULL,
  `created_by_id` smallint(5) unsigned NOT NULL DEFAULT ''0'',
  `created_by_name` varchar(100) DEFAULT NULL,
  `created_by_email` varchar(100) DEFAULT NULL,
  `updated_on` datetime DEFAULT NULL,
  `updated_by_id` smallint(5) unsigned DEFAULT NULL,
  `updated_by_name` varchar(100) DEFAULT NULL,
  `updated_by_email` varchar(100) DEFAULT NULL,
  `due_on` date DEFAULT NULL,
  `completed_on` datetime DEFAULT NULL,
  `completed_by_id` smallint(5) unsigned DEFAULT NULL,
  `completed_by_name` varchar(100) DEFAULT NULL,
  `completed_by_email` varchar(100) DEFAULT NULL,
  `comments_count` smallint(5) unsigned DEFAULT NULL,
  `has_time` tinyint(1) unsigned NOT NULL DEFAULT ''0'',
  `is_locked` tinyint(3) unsigned DEFAULT NULL,
  `estimate` float(9,2) DEFAULT NULL,
  `start_on` date DEFAULT NULL,
  `start_on_text` varchar(50) DEFAULT NULL,
  `due_on_text` varchar(50) DEFAULT NULL,
  `workflow_status` int(4) DEFAULT NULL,
  `varchar_field_1` varchar(255) DEFAULT NULL,
  `varchar_field_2` varchar(255) DEFAULT NULL,
  `integer_field_1` int(11) DEFAULT NULL,
  `integer_field_2` int(11) DEFAULT NULL,
  `float_field_1` double(10,2) DEFAULT NULL,
  `float_field_2` double(10,2) DEFAULT NULL,
  `text_field_1` longtext,
  `text_field_2` longtext,
  `date_field_1` date DEFAULT NULL,
  `date_field_2` date DEFAULT NULL,
  `datetime_field_1` datetime DEFAULT NULL,
  `datetime_field_2` datetime DEFAULT NULL,
  `boolean_field_1` tinyint(1) unsigned DEFAULT NULL,
  `boolean_field_2` tinyint(1) unsigned DEFAULT NULL,
  `position` int(10) unsigned DEFAULT NULL,
  `version` int(10) unsigned NOT NULL DEFAULT ''0'',
  PRIMARY KEY (`id`),
  KEY `type` (`type`),
  KEY `module` (`module`),
  KEY `project_id` (`project_id`),
  KEY `parent_id` (`parent_id`),
  KEY `created_on` (`created_on`),
  KEY `due_on` (`due_on`)
  KEY `milestone_id` (`milestone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=993109 DEFAULT CHARSET=utf8'

解决方法:

正如@Ray指出的那样,不必在每个插入,更新或删除操作上都重新建立索引.因此,如果您只想提高此(或类似)查询的效率,请在(名称,类型)或(类型,名称)上添加索引.

由于您已经单独拥有一个关于(类型)的索引,因此我将添加第一个索引:

ALTER TABLE project_objects 
  ADD INDEX name_type_IDX
    (name, type) ;

在繁忙的服务器上可能需要花费几秒钟的时间,但是必须执行一次,然后所有具有您条件的查询都会受益.它还可以提高仅涉及名称或名称和类型的其他几种查询的效率:

WHERE name = 'Design' AND type = 'Ticket'      --- your query

WHERE name = 'Design'                          --- condition on `name` only 

GROUP BY name                                  --- group by  `name`

WHERE name LIKE 'Design%'                      --- range condition on `name` only

WHERE name = 'Design'                          --- equality condition on `name`
  AND type LIKE 'Ticket%'                      --- and range condition on `type`

WHERE name = 'Design'                          --- equality condition on `name`
GROUP BY type                                  --- and group by `type`

GROUP BY name                                  --- group by  `name`
       , type                                  --- and  `type`

标签:indexing,database-performance,mysql,database
来源: https://codeday.me/bug/20191031/1975179.html