簡體   English   中英

如何優化此mysql查詢-解釋輸出內容

[英]How to optimize this mysql query - explain output included

這是查詢(基本上是基於標簽的搜索查詢):-

select
SUM(DISTINCT(ttagrels.id_tag in (2105,2120,2151,2026,2046) )) as key_1_total_matches, td.*, u.* 
from Tutors_Tag_Relations AS ttagrels
Join Tutor_Details AS td ON td.id_tutor = ttagrels.id_tutor
JOIN Users as u on u.id_user = td.id_user 
where  (ttagrels.id_tag in (2105,2120,2151,2026,2046)) group by td.id_tutor HAVING key_1_total_matches = 1

以下是執行此查詢所需的數據庫轉儲:-

CREATE TABLE IF NOT EXISTS `Users` (
  `id_user` int(10) unsigned NOT NULL auto_increment,
  `id_group` int(11) NOT NULL default '0',

  PRIMARY KEY  (`id_user`),
  KEY `Users_FKIndex1` (`id_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=730 ;

INSERT INTO `Users` (`id_user`, `id_group`) VALUES
(303, 1);


CREATE TABLE IF NOT EXISTS `Tutor_Details` (
  `id_tutor` int(10) unsigned NOT NULL auto_increment,
  `id_user` int(10) NOT NULL default '0',

  PRIMARY KEY  (`id_tutor`),
  KEY `Users_FKIndex1` (`id_user`),
  KEY `id_user` (`id_user`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=58 ;

INSERT INTO `Tutor_Details` (`id_tutor`, `id_user`) VALUES
(26, 303);


CREATE TABLE IF NOT EXISTS `Tags` (
  `id_tag` int(10) unsigned NOT NULL auto_increment,
  `tag` varchar(255) default NULL,
  PRIMARY KEY  (`id_tag`),
  UNIQUE KEY `tag` (`tag`),
  KEY `id_tag` (`id_tag`),
  KEY `tag_2` (`tag`),
  KEY `tag_3` (`tag`),
  KEY `tag_4` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2957 ;


INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
(2026, 'Brendan.\nIn'),
(2046, 'Brendan.'),
(2105, 'Brendan'),
(2120, 'Brendan''s'),
(2151, 'Brendan)');


CREATE TABLE IF NOT EXISTS `Tutors_Tag_Relations` (
  `id_tag` int(10) unsigned NOT NULL default '0',
  `id_tutor` int(10) unsigned default NULL,
  `tutor_field` varchar(255) default NULL,
  `cdate` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `udate` timestamp NULL default NULL,
  KEY `Tutors_Tag_Relations` (`id_tag`),
  KEY `id_tutor` (`id_tutor`),
  KEY `id_tag` (`id_tag`),
  KEY `id_tutor_2` (`id_tutor`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `Tutors_Tag_Relations` (`id_tag`, `id_tutor`, `tutor_field`, `cdate`, `udate`) VALUES
(2105, 26, 'firstname', '2010-06-17 17:08:45', NULL);

ALTER TABLE `Tutors_Tag_Relations`
  ADD CONSTRAINT `Tutors_Tag_Relations_ibfk_2` FOREIGN KEY (`id_tutor`) REFERENCES `Tutor_Details` (`id_tutor`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `Tutors_Tag_Relations_ibfk_1` FOREIGN KEY (`id_tag`) REFERENCES `Tags` (`id_tag`) ON DELETE NO ACTION ON UPDATE NO ACTION;

查詢做什么? 該查詢實際上搜索包含“ Brendan”(作為其姓名或傳記等名稱)的導師。 id_tags 2105,2120,2151,2026,2046只是類似“%Brendan%”之類的標簽。

我的問題是:

1.在此查詢的說明中,參考列的ttagrels顯示為NULL,但可能有鍵(Tutors_Tag_Relations,id_tutor,id_tag,id_tutor_2)。 因此,為什么不采用任何密鑰。 如何使查詢引用。 有可能嗎? 2.其他兩個表td和u使用引用。 這些中需要索引嗎? 我想不是。

在此處檢查說明查詢輸出, 網址為http://www.test.examvillage.com/explain.png

不要用表中的單個記錄來分析數據庫的性能。 創建至少100條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM