私が扱っていること:
ActiveCollab 2を使用するプロジェクトがあり、データベース構造は私にとって新しいものです。実際には、すべてがproject_objects
テーブルに格納され、再帰的に階層関係にあります。
- レコード1234は123の
type
「チケット」である可能性がありますparent_id
- レコード123は12の
type
「カテゴリ」である可能性がありますparent_id
type
レコード12は「マイルストーン」などである可能性があります。
現在、このテーブルには450,000以上のレコードがあり、コード内のクエリの多くはname
、インデックスがないフィールドを参照しています。値の例はDesign
またはDevelopment
です。
これはクエリの例です。
SELECT * FROM project_objects WHERE type = "Ticket" and name = "Design"
私の問題:
name
12〜15秒以上かかるクエリがありますが、その列からのインデックスがなく、全文検索が必要だと感じてい
ます。インデックスについての私の理解は、name
フィールドにインデックスを追加すると、読み取りは高速化されますが、挿入と更新は遅くなるということです。レコードが追加または更新されるたびにインデックスを完全に再構築する必要がありますか、それとも単に変更/追加されただけですか?より高速な書き込みに依存するコードベースの他の部分の速度を大幅に低下させることを意味する場合は、このクエリをインデックスで最適化したくありません。
私の質問:
1日あたり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'