7

我有两张桌子:

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。专辑按艺术家名称 ASC、专辑名称 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_idand之间album_artist_id,所以它必须与索引执行相同的连接才能生成排序的最终需要索引 ( artist_name, album_name)。

然后,您需要将您的订单更改为:ORDER BY artist_name, artist_id, album_name。这是因为可能有两个artist_name相同的,这将导致它的顺序与您期望的不同。它还会阻止它使用索引。

仅使用 上的索引artist_name,并且album_name没有提供足够的信息来产生这种排序,您所拥有的只是一个有序的名称列表,没有任何内容表明它们如何连接到另一个表。

于 2012-10-28T13:07:57.337 回答
1

尝试将索引更改为(album_artist_id)索引(album_artist_id, album_name)

于 2012-05-25T10:48:21.093 回答
1

如果您没有完整的 where 子句由 order by 列上的索引解析,则需要注意的主要事情是您需要扫描多少行来解​​析 order by。如果只检查 50 行以提供 10 行结果集,那么您的状态还不错,但如果是 5000 行,您可能需要重新考虑索引。

您可以做的第二件事是将sort_buffer_size增大

于 2012-05-25T10:52:38.173 回答
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.htmlhttp://www.tizag.com/mysqlTutorial/mysql-index.php

于 2012-05-25T10:46:44.703 回答