【发布时间】:2012-06-03 01:04:53
【问题描述】:
我遇到了性能问题,以下是在大约 2.5 秒内执行,仅返回 40 行:
SELECT DISTINCT song.song_id, song.title, song.length, song.bpm, song.keysig
FROM song
INNER JOIN (
SELECT song_id
FROM song_genre
WHERE genre_id IN ('25')
) genre1 ON genre1.song_id = song.song_id
INNER JOIN (
SELECT song_id
FROM song_production
WHERE production_id IN ('8')
) production1 ON production1.song_id = song.song_id
WHERE approved='1'
ORDER by song.priority DESC, song.song_id DESC
LIMIT 0, 40
运行查询丢弃 ORDER BY 会在 0.01 秒内执行,等等。
我知道这个问题可能与计算信息的方式有关,由于我正在使用 JOINS,所以可能需要嵌套查询,但我不是 100% 我会怎么做?
ID Select_type表类型可能_keys键键键ref行额外
1 PRIMARY 所有 NULL NULL NULL NULL 321使用文件排序
1 PRIMARY 表 表 表song:CREATE TABLE `song` (
`song_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` tinytext,
`length` varchar(5) DEFAULT NULL,
`Type` varchar(1) DEFAULT NULL,
`Vocals` varchar(10) DEFAULT NULL,
`Themes` varchar(10) DEFAULT NULL,
`Explicit` varchar(10) DEFAULT NULL,
`timesig` varchar(3) DEFAULT NULL,
`keysig` varchar(250) NOT NULL,
`bpm` int(3) DEFAULT NULL,
`speed` varchar(7) DEFAULT NULL,
`Era` varchar(10) DEFAULT NULL,
`Language` varchar(10) DEFAULT NULL,
`Keywords` varchar(10) DEFAULT NULL,
`description` mediumtext,
`search_description` longtext NOT NULL,
`key` varchar(25) NOT NULL,
`priority` int(2) NOT NULL,
`approved` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`song_id`),
FULLTEXT KEY `description` (`description`),
FULLTEXT KEY `search_description` (`search_description`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `head_desc` (`title`,`search_description`)
) ENGINE=MyISAM
AUTO_INCREMENT=1388
DEFAULT CHARSET=utf8 ;
song_genre:CREATE TABLE `song_genre` (
`genre_id` int(10) NOT NULL,
`song_id` int(10) NOT NULL,
PRIMARY KEY (`genre_id`,`song_id`)
) ENGINE=MyISAM
DEFAULT CHARSET=latin1 ;
song_production:CREATE TABLE `song_production` (
`production_id` int(10) NOT NULL,
`song_id` int(10) NOT NULL,
PRIMARY KEY (`production_id`,`song_id`)
) ENGINE=MyISAM
DEFAULT CHARSET=latin1 ;
【问题讨论】:
-
派生表造成了损害。试试 MySQL 视图。
-
LIKE '%'??你为什么有这个?为什么需要派生表? -
@ypercube,派生表用于响应previous question - 另外,
LIKE '%'错误地留在了那里,但不影响性能。 -
@gowri 你能进一步解释一下吗?
-
@Sharpedges:链接显示不同的查询。请使用有意义的查询编辑您的问题。事实上,整个(第一个)派生表可以完全删除。如果您添加表的定义也很好。了解什么是主键和外键会有所帮助。
标签: mysql performance