7

私は2つのテーブルを持っています:

Table of Artists (tbl_artist):

artist_id - primary key
artist_name - has index   


Table of Albums (tbl_album):

album_id - primary key
album_artist_id - foreign key, has index
album_name - has index too

テーブルには本番サーバー上に多くのレコードがあります (アーティスト - 60k、アルバム - 250k)。

インデックス ページには、ページネーション ステップ = 50 のアルバムのリストがあります。アルバムは、artist_name ASC、album_name ASC で並べ替えられます。したがって、単純化されたクエリは次のとおりです。

SELECT *
FROM tbl_artist, tbl_album
WHERE album_artist_id = artist_id
ORDER BY artist_name, album_name
LIMIT 0, 50

クエリの実行時間が非常に長い。おそらく、異なるテーブルの列による順序付けが原因です。注文を1つだけ残すと、クエリがすぐに実行されます。

そのような状況で何ができるでしょうか?どうもありがとう。

編集:説明:

+----+-------------+---------------+--------+------------------+---------+---------+-----------------------------------+--------+---------------------------------+
| id | select_type | table         | type   | possible_keys    | key     | key_len | ref                               | rows   | Extra                           |
+----+-------------+---------------+--------+------------------+---------+---------+-----------------------------------+--------+---------------------------------+
|  1 | SIMPLE      | tbl_album     | ALL    | album_artist_id  | NULL    | NULL    | NULL                              | 254613 | Using temporary; Using filesort |
|  1 | SIMPLE      | tbl_artist    | eq_ref | PRIMARY          | PRIMARY | 4       | db.tbl_album.album_artist_id      |      1 |                                 |
+----+-------------+---------------+--------+------------------+---------+---------+-----------------------------------+--------+---------------------------------+

STRAIGHT_JOINで説明

+----+-------------+---------------+------+-----------------+-----------------+---------+------------------------------------+-------+---------------------------------+
| id | select_type | table         | type | possible_keys   | key             | key_len | ref                                | rows  | Extra                           |
+----+-------------+---------------+------+-----------------+-----------------+---------+------------------------------------+-------+---------------------------------+
|  1 | SIMPLE      | tbl_artist    | ALL  | PRIMARY         | NULL            | NULL    | NULL                               | 57553 | Using temporary; Using filesort |
|  1 | SIMPLE      | tbl_album     | ref  | album_artist_id | album_artist_id | 4       | db.tbl_artist.artist_id            |     5 |                                 |
+----+-------------+---------------+------+-----------------+-----------------+---------+------------------------------------+-------+---------------------------------+
4

5 に答える 5

5

artist_name( , artist_id) と( album_artist_id, )のインデックスが必要ですalbum_name。その理由は、結合が と の間にあるためです。そのためartist_idalbum_artist_idインデックスで同じ結合を実行して、並べ替えに必要な最終的なインデックス ( artist_name, album_name) を生成する必要があります。

次に、順序 by を次のように変更する必要がありますORDER BY artist_name, artist_id, album_name。これはartist_name、同じ が 2 つ存在する可能性があり、期待どおりに順序付けされない可能性があるためです。また、インデックスを使用できなくなります。

のインデックスだけを使用すると、その並べ替えを生成するのに十分な情報が提供さartist_namealbum_nameません。他のテーブルに接続する方法を示すものは何もない名前の順序付きリストしかありません。

于 2012-10-28T13:07:57.337 に答える
1

注目すべき主なことは、列ごとの順序でインデックスによって解決された完全な where 句がない場合、order by を解決するためにスキャンする必要がある行の数です。10 行の結果セットを提供するために 50 行のみが検査された場合は、適切な状態ですが、5000 行の場合は、インデックス作成を再考する必要があるかもしれません。

次にできることは、sort_buffer_sizeを大きくすることです。

于 2012-05-25T10:52:38.173 に答える
1

(album_artist_id)のインデックスをのインデックスに変更してみてください(album_artist_id, album_name)

于 2012-05-25T10:48:21.093 に答える
0

列にインデックスを追加しますorder by

クエリに時間がかかる理由を知りたい場合は、 をご覧ください EXPLAIN。例:

explain select * from your_table order by col1, col2
于 2012-05-25T10:46:14.220 に答える
0

ソートする列にインデックスを追加することは、かなりのことです。はい、サーバーでより多くのスペースが必要になりますが、実行は最高です。インデックスの詳細: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.htmlまたはhttp://www.tizag.com/mysqlTutorial/mysql-index.php

于 2012-05-25T10:46:44.703 に答える