2011-01-20 7 views
2

みんな私はしばらく時間をかけているし、一時的な使用を最適化することはできません。 EXPLAINクエリからfilesortを使用しています。 OKだから、私はこのクエリを持っている:一時的な使用のためのMYSQLの最適化。 filesortを使用しています! - > HELP

SELECT a.adid, a.adtitle, a.addesc, scat.subcatname 
FROM ads a 
INNER JOIN cities ct ON a.cityid = ct.cityid 
INNER JOIN subcats scat ON a.subcatid = scat.subcatid 
INNER JOIN cats cat ON scat.catid = cat.catid 
WHERE a.enabled = '1' 
AND a.verified ='1' 
GROUP BY a.adid 
ORDER BY a.createdon DESC 
LIMIT 16; 

私はこれを取得... EXPLAINないとき:私はいくつかのKEYのが、ノー結果を試してみました

EXPLAIN SELECT a.adid, a.adtitle, a.addesc, scat.subcatname 
FROM ads a 
INNER JOIN cities ct ON a.cityid = ct.cityid 
INNER JOIN subcats scat ON a.subcatid = scat.subcatid 
INNER JOIN cats cat ON scat.catid = cat.catid 
WHERE a.enabled = '1' 
AND a.verified ='1' 
GROUP BY a.adid 
ORDER BY a.createdon DESC LIMIT 16; 

+----+-------------+-------+--------+----------------------------------+----------+---------+--------------------------------+------+---------------------------------+ 
| id | select_type | table | type | possible_keys     | key  | key_len | ref       | rows | Extra       | 
+----+-------------+-------+--------+----------------------------------+----------+---------+--------------------------------+------+---------------------------------+ 
| 1 | SIMPLE  | cat | system | PRIMARY       | NULL  | NULL | NULL       | 1 | Using temporary; Using filesort | 
| 1 | SIMPLE  | scat | ref | PRIMARY,catid     | catid | 2  | const       | 7 |         | 
| 1 | SIMPLE  | a  | ref | subcatid,cityid,verified,enabled | subcatid | 2  | bakecai_incontri.scat.subcatid | 954 | Using where      | 
| 1 | SIMPLE  | ct | eq_ref | PRIMARY       | PRIMARY | 2  | bakecai_incontri.a.cityid  | 1 | Using index      | 
+----+-------------+-------+--------+----------------------------------+----------+---------+--------------------------------+------+---------------------------------+ 
4 rows in set (0.00 sec) 

を:例えば私はのためにインデックスを作成しますcreatedonとadidはmysqlを使用しません。 HERE

SHOW INDEX FROM ads; 

+-------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
|Table| Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| ads |   0 | PRIMARY   |   1 | adid  | A   |  8592 |  NULL | NULL |  | BTREE  |   | 
| ads |   1 | subcatid   |   1 | subcatid | A   |   9 |  NULL | NULL |  | BTREE  |   | 
| ads |   1 | cityid    |   1 | cityid  | A   |   103 |  NULL | NULL |  | BTREE  |   | 
| ads |   1 | verified   |   1 | verified | A   |   2 |  NULL | NULL | YES | BTREE  |   | 
| ads |   1 | enabled   |   1 | enabled  | A   |   2 |  NULL | NULL | YES | BTREE  |   | 
| ads |   1 | idx_createdon_adid |   1 | createdon | A   |  8592 |  NULL | NULL |  | BTREE  |   | 
| ads |   1 | idx_createdon_adid |   2 | adid  | A   |  8592 |  NULL | NULL |  | BTREE  |   | 
| ads |   1 | srch_text   |   1 | adtitle  | NULL  |   1 |  NULL | NULL | YES | FULLTEXT |   | 
| ads |   1 | srch_text   |   2 | addesc  | NULL  |   1 |  NULL | NULL | YES | FULLTEXT |   | 
| ads |   1 | srch_text   |   3 | nome  | NULL  |   1 |  NULL | NULL | YES | FULLTEXT |   | 
+-------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
10 rows in set (0.00 sec) 

テーブルのいくつかの簡単な説明です:ここ

は私のテーブルのキーです

DESCRIBE ads 
    -> ; 
+-----------+----------------------+------+-----+---------------------+----------------+ 
| Field  | Type     | Null | Key | Default    | Extra   | 
+-----------+----------------------+------+-----+---------------------+----------------+ 
| adid  | int(10) unsigned  | NO | PRI | NULL    | auto_increment | 
| nome  | varchar(255)   | YES |  | NULL    |    | 
| eta  | varchar(255)   | YES |  | NULL    |    | 
| adtitle | varchar(100)   | YES | MUL | NULL    |    | 
| addesc | text     | YES |  | NULL    |    | 
| email  | varchar(50)   | YES |  | NULL    |    | 
| phone  | varchar(255)   | YES |  | NULL    |    | 
| showemail | enum('0','1','2') | YES |  | NULL    |    | 
| code  | varchar(35)   | YES |  | NULL    |    | 
| first  | varchar(255)   | YES |  | NULL    |    | 
| cityid | smallint(5) unsigned | NO | MUL | 0     |    | 
| subcatid | smallint(5) unsigned | NO | MUL | 0     |    | 
| price  | decimal(10,2)  | NO |  | 0.00    |    | 
| hits  | int(10) unsigned  | NO |  | 0     |    | 
| ip  | varchar(15)   | YES |  | NULL    |    | 
| link  | varchar(255)   | YES |  | http://    |    | 
| verified | enum('0','1')  | YES | MUL | NULL    |    | 
| abused | int(10) unsigned  | NO |  | 0     |    | 
| enabled | enum('0','1')  | YES | MUL | NULL    |    | 
| createdon | datetime    | NO | MUL | 0000-00-00 00:00:00 |    | 
| expireson | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| timestamp | timestamp   | NO |  | CURRENT_TIMESTAMP |    | 
+-----------+----------------------+------+-----+---------------------+----------------+ 
22 rows in set (0.02 sec) 

DESCRIBE cities 
    -> ; 
+-----------+----------------------+------+-----+-------------------+----------------+ 
| Field  | Type     | Null | Key | Default   | Extra   | 
+-----------+----------------------+------+-----+-------------------+----------------+ 
| cityid | smallint(5) unsigned | NO | PRI | NULL    | auto_increment | 
| cityname | varchar(50)   | YES |  | NULL    |    | 
| regionid | smallint(5) unsigned | NO | MUL | 0     |    | 
| pos  | smallint(5) unsigned | NO | MUL | 0     |    | 
| enabled | enum('0','1')  | YES | MUL | NULL    |    | 
| timestamp | timestamp   | NO |  | CURRENT_TIMESTAMP |    | 
+-----------+----------------------+------+-----+-------------------+----------------+ 
6 rows in set (0.00 sec) 

DESCRIBE cats 
    -> ; 
+-----------+----------------------+------+-----+-------------------+----------------+ 
| Field  | Type     | Null | Key | Default   | Extra   | 
+-----------+----------------------+------+-----+-------------------+----------------+ 
| catid  | smallint(5) unsigned | NO | PRI | NULL    | auto_increment | 
| catname | varchar(50)   | YES |  | NULL    |    | 
| pos  | smallint(5) unsigned | NO |  | 0     |    | 
| enabled | enum('0','1')  | YES | MUL | NULL    |    | 
| timestamp | timestamp   | NO |  | CURRENT_TIMESTAMP |    | 
+-----------+----------------------+------+-----+-------------------+----------------+ 
5 rows in set (0.00 sec) 

すべてのヘルプ、私は感謝します!

答えて

1
SELECT a.adid, a.adtitle, a.addesc, scat.subcatname 
FROM ads a 
INNER JOIN 
     subcats scat 
ON  a.subcatid = scat.subcatid 
WHERE a.enabled = '1' 
     AND a.verified ='1' 
ORDER BY a.createdon 
     DESC 
LIMIT 16 

不必要な結合を削除し、不要なものを取り除いたGROUP BY。 - here you will find more informationあなたが強制的にインデックスで遊んでする必要が

CREATE INDEX ix_ads_e_v_created ON ads (enabled, verified, createdon) 
+0

これは改善されましたが...私は別の小さな問題を抱えていますが、今度はクエリがすべての行をスキャンしています – user583012

0

filesortを取り除くために、次のインデックスを作成します。しかし、あなたの場合は、ジョインやグループに対して異なるインデックスを使用するので、mysqlはそれらを「再利用」する機会がないので、あまり役に立ちません。

0

OK、それが改善されたが、今のクエリは、すべての行をスキャンしている:私はすべての行が有効になっており、1に等しいを確認したためであると考え --hmm ...

EXPLAIN SELECT a.adid, a.adtitle, a.addesc, scat.subcatname 
    -> FROM ads a 
    -> INNER JOIN subcats scat 
    -> ON a.subcatid = scat.subcatid 
    -> WHERE a.enabled = '1' 
    -> AND a.verified ='1' 
    -> ORDER BY a.createdon DESC 
    -> LIMIT 16; 
+----+-------------+-------+--------+----------------------------------------------+--------------------+---------+-----------------------------+------+-------------+ 
| id | select_type | table | type | possible_keys        | key    | key_len | ref       | rows | Extra  | 
+----+-------------+-------+--------+----------------------------------------------+--------------------+---------+-----------------------------+------+-------------+ 
| 1 | SIMPLE  | a  | ref | subcatid,verified,enabled,ix_ads_e_v_created | ix_ads_e_v_created | 4  | const,const     | 8485 | Using where | 
| 1 | SIMPLE  | scat | eq_ref | PRIMARY          | PRIMARY   | 2  | bakecai_incontri.a.subcatid | 1 |    | 
+----+-------------+-------+--------+----------------------------------------------+--------------------+---------+-----------------------------+------+-------------+ 
2 rows in set (0.00 sec) 

何から私はインデックスを作る必要があることを知っていますか?列/列にはありますか?ただ、にやにや笑いのため

+0

クエリはすべての行をスキャンしていません: 'ref'アクセスでインデックスを使用しており、 order、 'filesort'なし。また、元の質問を更新し、回答を回答として投稿しないでください。ありがとう。 – Quassnoi

0

...小さいことサブカテゴリテーブルを有することにより

SELECT STRAIGHT_JOIN(クエリの残りの部分)

への変更は、オプティマイザエンジンを使用しようとしている照会とNOTの基礎としてクエリの最初のテーブル...この1つのキーワード「STRAIGHT_JOIN」は過去15時間以上のルックアップテーブルに加わった1400万レコードのgov'tクエリを実行して、30時間以上経過してから2時間未満にプロセスをハングアップさせてくれました完了する。

関連する問題