0

以下の SQL クエリを使用していますが、実行に 180 秒以上かかります。それをスピードアップする方法はありますか?この SQL は、pic_id とすべての女性の ID を教えてくれます。

SELECT pic_id, small
FROM picture
WHERE hide =0
AND userhide =0
AND  `fbid` 
IN (

      SELECT fbid
      FROM user
      WHERE gender =  "female"
   )

ORDER BY  `picture`.`pic_id` ASC 
LIMIT 1500 , 200

Explain SQL

id select_type         table    type   possible_keys  key      key_len  ref   rows  Extra
1  PRIMARY             picture  index  NULL           PRIMARY  4        NULL  1700  Using where
2  DEPENDENT SUBQUERY  user     ALL    NULL           NULL     NULL     NULL  7496  Using where

--- Tim の sql answer に対する Explain ステートメントの結果 ---

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  picture ALL NULL    NULL    NULL    NULL    41443   Using where; Using temporary; Using filesort
1   SIMPLE  user    ALL NULL    NULL    NULL    NULL    7501    Using where; Using join buffer

- 構造 - -

CREATE TABLE `user` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 NOT NULL,
`first_name` varchar(255) CHARACTER SET utf8 NOT NULL,
`username` varchar(255) CHARACTER SET utf8 NOT NULL,
`birthday` date NOT NULL,
`location` varchar(255) CHARACTER SET utf8 NOT NULL,
`gender` varchar(6) CHARACTER SET utf8 NOT NULL,
`created` date NOT NULL,
`fbid` bigint(50) NOT NULL,
`token` varchar(255) CHARACTER SET utf8 NOT NULL,
`relationship_status` varchar(20) CHARACTER SET utf8 NOT NULL,
`smallest` varchar(255) CHARACTER SET utf8 NOT NULL,
`email` varchar(40) CHARACTER SET utf8 NOT NULL,
`ref` varchar(15) NOT NULL,
PRIMARY KEY (`sid`),
KEY `gender` (`gender`),
KEY `fbid` (`fbid`)
) ENGINE=MyISAM AUTO_INCREMENT=7595 DEFAULT CHARSET=latin

---- ピクチャーテーブルの構造 ---

CREATE TABLE `picture` (
 `fbid` bigint(50) NOT NULL,
 `pic_id` int(11) NOT NULL AUTO_INCREMENT,
 `pic_location` varchar(255) NOT NULL,
 `hide` int(1) NOT NULL,
 `small` varchar(255) NOT NULL,
 `userhide` int(1) NOT NULL,
 `likes` int(10) NOT NULL,
 `hot` int(1) NOT NULL,
 PRIMARY KEY (`pic_id`),
 UNIQUE KEY `pic_location` (`pic_location`),
 UNIQUE KEY `small` (`small`),
 KEY `fbid` (`fbid`),
 KEY `hide` (`hide`),
 KEY `userhide` (`userhide`)
) ENGINE=MyISAM AUTO_INCREMENT=42749 DEFAULT CHARSET=latin1
4

2 に答える 2

4

このようなことを試してください:

SELECT pic_id, small
FROM picture
INNER JOIN user ON ( picture.fbid = user.fbid and user.gender='female' )
WHERE hide =0
AND userhide =0
ORDER BY  `picture`.`pic_id` ASC 
LIMIT 1500 , 200

クエリは内部結合で一致しない行を返さないため、結合に性別を入れました。

このスタック オーバーフローのトピックもお読みください。

編集:

次のフィールドにインデックスを付けていることを確認してください。

picture.fbid
user.fbid
user.gender
picture.hide
picture.userhide
于 2012-09-20T04:59:24.070 に答える
1

代わりに結合を使用してみてください。

SELECT p.pic_id, p.small
FROM picture p
INNER JOIN fbid f USING ( fbid )
WHERE p.hide =0
AND p.userhide =0
AND f.gender = 'female'
ORDER BY  `picture`.`pic_id` ASC 
LIMIT 1500 , 200
于 2012-09-20T04:58:54.347 に答える