7

2 つのレコードを取得するだけで約 3.5 秒かかるクエリがあります。ただし、証言には 10 万行、ユーザーには 13,000 行、コースには 850 行、試験には 2 行があります。

SELECT t.*, u.name, f.feedback
FROM testmonials t
INNER JOIN user u ON u.id = t.userid
INNER JOIN courses co ON co.id = t.courseid
LEFT JOIN exam ex ON ex.id = t.exam_id
WHERE t.status = 4
AND t.verfication_required = 'Y'
AND t.verfication_completed = 'N'
ORDER BY t.submissiondate DESC

.結果の説明: .

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  co  ALL     PRIMARY     NULL    NULL    NULL    850     Using temporary; Using filesort
1   SIMPLE  t   ref     CID,nuk_tran_user   CID     4   kms.co.id   8   Using where
1   SIMPLE  u   eq_ref  PRIMARY     PRIMARY     4   kms.t.userid    1   Using where
1   SIMPLE  ex  eq_ref  PRIMARY     PRIMARY     3   kms.t.eval_id   1   

coursesテーブル結合を削除すると、クエリは非常に迅速に結果を返します。このクエリですべてのコース行、つまり 850 を選択する必要がある理由がわかりません。

私が間違っていることはありますか?

編集: 私はコース ID、ユーザー ID の証言テーブルにインデックスを持っています。これらはそれぞれのテーブルの主キーです。

編集2

testimonials テーブルから courseid インデックスを削除したところ (テストのため)、興味深いことに、クエリは 0.22 秒で結果を返しました!!!?? 上記と同じ他のすべては、このインデックスのみを削除しただけです。

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  t   ALL     nuk_tran_user   NULL    NULL    NULL    130696  Using where; Using filesort
1   SIMPLE  u   eq_ref  PRIMARY     PRIMARY     4   kms.t.userid    1   Using where
1   SIMPLE  co  eq_ref  PRIMARY     PRIMARY     4   kms.t.courseid  1   
1   SIMPLE  ex  eq_ref  PRIMARY     PRIMARY     3   kms.t.exam_id   1   

編集3

編集3

CREATE TABLE IF NOT EXISTS `courses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `duration` varchar(100) NOT NULL DEFAULT '',
  `objectives` text NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `updated_by` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=851 ;


Testimonials


CREATE TABLE IF NOT EXISTS `testimonials` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `feedback` text NOT NULL,  
  `userid` int(10) unsigned NOT NULL DEFAULT '0',
  `courseid` int(10) unsigned NOT NULL DEFAULT '0',
  `eventid` int(10) unsigned NOT NULL DEFAULT '0',
  `emr_date` datetime DEFAULT NULL,
  `exam_required` enum('Y','N') NOT NULL DEFAULT 'N',
  `exam_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `emr_completed` enum('Y','N') NOT NULL DEFAULT 'N',
  PRIMARY KEY (`id`),
  KEY `event` (`eventid`),
  KEY `nuk_tran_user` (`userid`),
  KEY `emr_date` (`emr_date`),
  KEY `courseid` (`courseid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=134691 ;

.. これが最新の Explain クエリの結果です ...

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  t   ALL     nuk_tran_user,courseid  NULL    NULL    NULL    130696  Using where; Using filesort
1   SIMPLE  u   eq_ref  PRIMARY     PRIMARY     4   kms.t.userid    1   Using where
1   SIMPLE  co  eq_ref  PRIMARY     PRIMARY     4   kms.t.courseid  1   
1   SIMPLE  ex  eq_ref  PRIMARY     PRIMARY     3   kms.t.exam_id   1   
4

2 に答える 2

1

使用できる対応するインデックスがない ORDER BY を実行すると、遅延の問題が発生することが知られています。これはコーステーブルの問題に具体的には答えませんが。

元のクエリはほとんど問題ないように見えますが、「f.feedback」を参照しており、クエリに「f」エイリアスがありません。「verification_required」と「verification_completed」も参照しますが、テーブル構造には表示されませんが、「exam_required」と「emr_completed」は見つかります。

ただし、1つのことを変更します。証言テーブルでは、個々の列インデックスの代わりに、複数の列を持つもう1つ追加して、複数の条件クエリと順序の両方を利用します

create table ...
KEY StatVerifySubmit ( status, verification_required, verification_completed, submissionDate )

ただし、クエリはテーブル構造のリストにリストされていない列を参照しているようですが、代わりに

KEY StatVerifySubmit ( status, exam_required, emr_completed, emr_Date)
于 2013-04-06T12:15:41.393 に答える
0

元のクエリではなく、次のクエリを試していただけますか。

SELECT t.*, u.name, f.feedback
FROM testmonials t
INNER JOIN user u ON u.id = t.userid
LEFT JOIN exam ex ON ex.id = t.exam_id
WHERE t.status = 4
AND t.verfication_required = 'Y'
AND t.verfication_completed = 'N'
AND t.courseid in ( SELECT co.id FROM courses co)
ORDER BY t.submissiondate DESC

コース テーブルから列を選択する必要がありますか?

于 2013-03-31T10:16:09.473 に答える