我遇到了性能问题,以下是在大约 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 table type possible_keys key key_len ref rows Extra 1 PRIMARY <derived3> ALL NULL NULL NULL NULL 321 使用临时;使用文件排序 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3424 使用连接缓冲区 1 PRIMARY 歌曲 eq_ref PRIMARY PRIMARY 4 production1.song_id 1 使用 where 3 DERIVED song_production ref PRIMARY PRIMARY 4 339 使用索引 2 DERIVED song_genre index NULL PRIMARY 8 NULL 3424 使用where;使用索引
表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 ;