Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL索引帮助-哪个更快?_Mysql_Database_Indexing_Database Performance - Fatal编程技术网

MySQL索引帮助-哪个更快?

MySQL索引帮助-哪个更快?,mysql,database,indexing,database-performance,Mysql,Database,Indexing,Database Performance,我正在处理的问题: 我有一个使用2的项目,数据库结构对我来说是新的-实际上所有内容都存储到project\u objects表中,并且具有递归层次关系: 记录1234可能是父id为123的类型“Ticket” 记录123可能是类型的“类别”,父id为12 记录12可能是类型“里程碑”等 目前,此表中有超过450000条记录,代码中的许多查询引用了名称字段,该字段上没有索引。示例值可能是设计或开发 这可能是一个示例查询: 从type=“Ticket”和name=“Design”所在的项目对象中

我正在处理的问题:

我有一个使用2的项目,数据库结构对我来说是新的-实际上所有内容都存储到
project\u objects
表中,并且具有递归层次关系:

  • 记录1234可能是父id为123的
    类型
    “Ticket”
  • 记录123可能是
    类型
    的“类别”,父id为12
  • 记录12可能是
    类型
    “里程碑”等
目前,此表中有超过450000条记录,代码中的许多查询引用了
名称
字段,该字段上没有索引。示例值可能是
设计
开发

这可能是一个示例查询:

从type=“Ticket”和name=“Design”所在的项目对象中选择*

我的问题:

我有一个长达12-15秒的问题,我有一种感觉就是这样
name
列缺少索引,需要全文搜索。我对索引的理解是,如果我在
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'

name
列上添加单点索引的插入成本很可能可以忽略不计——它可能相当于添加了一个恒定的时间增量,可能不会超过几毫秒。您将占用一些额外的磁盘空间,但这通常不是一个问题。没有什么能比得上您在select performance上体验的几秒钟

添加索引,享受性能提升


顺便说一句:不是每次插入都“重建”索引。它们通常是在B-树中实现的,除非您经常删除,否则当您的级别超过几个级别时,应该只需要很少的重新平衡(并且用很少的深度重新平衡是非常便宜的)。

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

由于您已经在
(type)
上单独设置了索引,因此我将添加第一个索引:

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`
添加表定义(显示创建表项目对象的
输出)。对于此查询,最好在
(名称,类型)
(类型,名称)
上建立索引。