我在使用 Doctrine2 的 Symfony2 项目中查询缓慢。我不确定是什么在减慢速度。我试图自己追踪它,但已经没有想法了。基本思想是我想从给定的提要中获取前 20 篇文章(按 ID),并按发布日期对它们进行排序。当我在我的开发机器上整理大约 300 篇文章(生产机器有数千篇)时,似乎 1 秒有点长。
查询是:
SELECT
a0_.id AS id0, a0_.guid AS guid1, a0_.title AS title2, a0_.pub_date AS pub_date3,
a0_.summary AS summary4, a0_.content AS content5, a0_.source_url AS source_url6,
a0_.comment_url AS comment_url7, a0_.slug AS slug8, a0_.bitly_url AS bitly_url9,
a0_.thumbnail_id AS thumbnail_id10, a0_.feed_id AS feed_id11,
a0_.author_id AS author_id12
FROM
articles a0_
WHERE
a0_.feed_id = ?
ORDER BY
a0_.pub_date DESC LIMIT 20
Parameters: ['19']
Time: 958.46 ms
运行解释,我得到这个:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a0_
type: ref
possible_keys: feed_guid,article_slug_unique,feed
key: feed_guid
key_len: 4
ref: const
rows: 338
Extra: Using where; Using filesort
1 row in set (0.11 sec)
这是我的桌子:
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(255) | NO | | NULL | |
| title | varchar(255) | NO | | NULL | |
| author_id | int(10) unsigned | YES | MUL | NULL | |
| pub_date | datetime | YES | MUL | NULL | |
| summary | text | YES | | NULL | |
| content | text | NO | | NULL | |
| source_url | varchar(255) | YES | | NULL | |
| comment_url | varchar(255) | YES | | NULL | |
| feed_id | int(10) unsigned | NO | MUL | NULL | |
| slug | varchar(64) | NO | MUL | NULL | |
| bitly_url | varchar(32) | YES | | NULL | |
| thumbnail_id | int(10) unsigned | YES | UNI | NULL | |
+--------------+------------------+------+-----+---------+----------------+
13 rows in set (0.09 sec)
我的指数:
+----------+------------+-----------------------+--------------+--------------+----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+-----------------------+--------------+--------------+------------------------+----------+--------+------+------------+---------+---------------+
| articles | 0 | PRIMARY | 1 | id | A | 51479 | NULL | NULL | | BTREE | | |
| articles | 0 | feed_guid | 1 | feed_id | A | 352 | NULL | NULL | | BTREE | | |
| articles | 0 | feed_guid | 2 | guid | A | 352 | NULL | NULL | | BTREE | | |
| articles | 0 | article_slug_unique | 1 | feed_id | A | 352 | NULL | NULL | | BTREE | | |
| articles | 0 | article_slug_unique | 2 | slug | A | 352 | NULL | NULL | | BTREE | | |
| articles | 0 | UNIQ_BFDD3168FDFF2E92 | 1 | thumbnail_id | A | 51479 | NULL | NULL | YES | BTREE | | |
| articles | 1 | author | 1 | author_id | A | 3677 | NULL | NULL | YES | BTREE | | |
| articles | 1 | feed | 1 | feed_id | A | 1660 | NULL | NULL | | BTREE | | |
| articles | 1 | slug_idx | 1 | slug | A | 51479 | NULL | NULL | | BTREE | | |
| articles | 1 | pub_date_idx | 1 | pub_date | A | 51479 | NULL | NULL | YES | BTREE | | |
+----------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
10 rows in set (0.68 sec)
如果有帮助,这里是 Doctrine2 代码:
$dql = $this->getEntityManager()
->createQueryBuilder()
->select('art')
->from('MyMainBundle:Article', 'art')
->where('art.feed = :f_id')
->orderBy('art.pubDate', 'DESC');
我认为必须有某种方法让 MySQL 使用我的pub_date_idx
索引来排序记录。我专门添加了索引,因为我认为我已经阅读过索引应该用于ORDER BY
. 请帮助我提高此查询性能。