我正在使用 InnoDB。
查询、解释和索引
选择
故事。*,
count(comments.id) 作为评论,
GROUP_CONCAT(
DISTINCT 分类 2.name SEPARATOR ';'
) 作为分类名称,
GROUP_CONCAT(
不同的图像.id
ORDER BY images.position,
images.id 分隔符';'
) 作为 images_id,
GROUP_CONCAT(
不同的图像.caption
ORDER BY images.position,
images.id 分隔符';'
) 作为 images_caption,
GROUP_CONCAT(
不同的图像.thumbnail
ORDER BY images.position,
images.id 分隔符';'
) 作为 images_thumbnail,
GROUP_CONCAT(
不同的图像.medium
ORDER BY images.position,
images.id 分隔符';'
) 作为图像_媒体,
GROUP_CONCAT(
不同的图像.大
ORDER BY images.position,
images.id 分隔符';'
) AS images_large,
GROUP_CONCAT(
DISTINCT users.id
ORDER BY users.id SEPARATOR ';'
) 作为作者 ID,
GROUP_CONCAT(
DISTINCT users.display_name
ORDER BY users.id SEPARATOR ';'
) 作为作者显示名称,
GROUP_CONCAT(
不同的 users.url
ORDER BY users.id SEPARATOR ';'
) 作为作者 URL
从
故事
LEFT JOIN 分类
ON stories.id = 分类.story_id
LEFT JOIN 分类 AS 分类2
ON stories.id = classifications2.story_id
左加入评论
ON stories.id = comments.story_id
左连接 image_story
ON stories.id = image_story.story_id
左连接图像
ON images.id = image_story.`image_id`
左连接 author_story
ON stories.id = author_story.story_id
左加入用户
ON users.id = author_story.author_id
WHERE 分类。`name` LIKE 'Home:Top%'
AND stories.status = 1
GROUP BY stories.id
按分类排序。`名称`,分类。`位置`
+----+-------------+------------------+--------+-- -------------+---------+---------+--------------- ---------+--------+------------------------------- ---------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+------------------+--------+-- -------------+---------+---------+--------------- ---------+--------+------------------------------- ---------------+
| 1 | 简单 | 故事 | 参考 | 状态 | 状态 | 1 | 常量 | 434792 | 使用哪里;使用临时的;使用文件排序 |
| 1 | 简单 | 分类 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 使用位置 |
| 1 | 简单 | 分类2 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 使用位置 |
| 1 | 简单 | 评论 | 参考 | 故事ID | 故事ID | 8 | 故事.id | 6 | 使用哪里;使用索引 |
| 1 | 简单 | 图片故事 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 空 |
| 1 | 简单 | 图片 | eq_ref | 初级 | 初级 | 4 | image_story.image_id | 1 | 空 |
| 1 | 简单 | 作者故事 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 使用位置 |
| 1 | 简单 | 用户 | eq_ref | 初级 | 初级 | 4 | author_story.author_id | 1 | 使用位置 |
+----+-------------+------------------+--------+-- -------------+---------+---------+--------------- ---------+--------+------------------------------- ---------------+
+-----------------+------------+-------------+---- ----------+-------------+------------+------------- +---------+--------+------+------------+
| 表 | 非唯一 | 键名 | Seq_in_index | 列名 | 整理 | 基数| 子部分 | 包装 | 空 | 索引类型 |
+-----------------+------------+-------------+---- ----------+-------------+------------+------------- +---------+--------+------+------------+
| 故事 | 0 | 初级 | 1 | 编号 | 一个 | 869584 | 空 | 空 | | BTREE |
| 故事 | 1 | created_at | 1 | created_at | 一个 | 434792 | 空 | 空 | | BTREE |
| 故事 | 1 | 来源 | 1 | 来源 | 一个 | 2 | 空 | 空 | 是 | BTREE |
| 故事 | 1 | source_id | 1 | source_id | 一个 | 869584 | 空 | 空 | 是 | BTREE |
| 故事 | 1 | 类型 | 1 | 类型 | 一个 | 2 | 空 | 空 | | BTREE |
| 故事 | 1 | 状态 | 1 | 状态 | 一个 | 2 | 空 | 空 | | BTREE |
| 故事 | 1 | 类型状态 | 1 | 类型 | 一个 | 2 | 空 | 空 | | BTREE |
| 故事 | 1 | 类型状态 | 2 | 状态 | 一个 | 2 | 空 | 空 | | BTREE |
| 分类 | 0 | 初级 | 1 | 编号 | 一个 | 207 | 空 | 空 | | BTREE |
| 分类 | 1 | 故事ID | 1 | 故事ID | 一个 | 207 | 空 | 空 | | BTREE |
| 分类 | 1 | 姓名 | 1 | 姓名 | 一个 | 103 | 空 | 空 | | BTREE |
| 分类 | 1 | 姓名 | 2 | 职位 | 一个 | 207 | 空 | 空 | 是 | BTREE |
| 评论 | 0 | 初级 | 1 | 编号 | 一个 | 239336 | 空 | 空 | | BTREE |
| 评论 | 1 | 状态 | 1 | 状态 | 一个 | 2 | 空 | 空 | | BTREE |
| 评论 | 1 | 日期 | 1 | 日期 | 一个 | 239336 | 空 | 空 | | BTREE |
| 评论 | 1 | 故事ID | 1 | 故事ID | 一个 | 39889 | 空 | 空 | | BTREE |
+-----------------+------------+-------------+---- ----------+-------------+------------+------------- +---------+--------+------+------------+
查询时间
平均0.035 seconds需要运行。
如果我只删除,平均GROUP BY时间会下降到0.007。
如果我只删除stories.status=1过滤器,时间平均下降到0.025。这似乎可以很容易地优化。
如果我只删除LIKE过滤器和ORDER BY子句,0.006平均时间会下降。
更新 1:2013-04-13
我的理解通过答案得到了多方面的改善。
我添加了索引author_story,images_story这似乎改进了0.025几秒钟的查询,但出于某种奇怪的原因,该EXPLAIN计划看起来好多了。此时删除ORDER BY删除查询到0.015秒并删除两者ORDER BY并将GROUP BY查询性能提高到0.006. 我是现在要关注的两件事吗?如果需要,我可能会ORDER BY进入应用程序逻辑。
以下是修改后EXPLAIN的INDEXES
+----+-------------+------------------+--------+-- -------------------------------+----------+-------- --+--------------+------+-------------- -------------------------------------------------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+------------------+--------+-- -------------------------------+----------+-------- --+--------------+------+-------------- -------------------------------------------------------+
| 1 | 简单 | 分类 | 范围 | story_id,名称 | 姓名 | 102 | 空 | 14 | 使用索引条件;使用临时的;使用文件排序 |
| 1 | 简单 | 故事 | eq_ref | 初级,状态 | 初级 | 4 | 分类.story_id | 1 | 使用位置 |
| 1 | 简单 | 分类2 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 使用位置 |
| 1 | 简单 | 作者故事 | 参考 | author_id,story_id,author_story | 故事ID | 4 | 故事.id | 1 | 使用索引条件 |
| 1 | 简单 | 用户 | eq_ref | 初级 | 初级 | 4 | author_story.author_id | 1 | 使用位置 |
| 1 | 简单 | 评论 | 参考 | 故事ID | 故事ID | 8 | 故事.id | 8 | 使用哪里;使用索引 |
| 1 | 简单 | 图片故事 | 参考 | story_id,story_id_2 | 故事ID | 4 | 故事.id | 1 | 空 |
| 1 | 简单 | 图片 | eq_ref | PRIMARY,position_id | 初级 | 4 | image_story.image_id | 1 | 空 |
+----+-------------+------------------+--------+-- -------------------------------+----------+-------- --+--------------+------+-------------- -------------------------------------------------------+
+-----------------+------------+------------------ --+----------------+--------------+------------+------ --------+----------+--------+------+------------+-- --------+---------------+
| 表 | 非唯一 | 键名 | Seq_in_index | 列名 | 整理 | 基数| 子部分 | 包装 | 空 | 索引类型 | 评论 | 索引评论 |
+-----------------+------------+------------------ --+----------------+--------------+------------+------ --------+----------+--------+------+------------+-- --------+---------------+
| 作者故事 | 0 | 初级 | 1 | 编号 | 一个 | 220116 | 空 | 空 | | BTREE | | |
| 作者故事 | 0 | 故事作者 | 1 | 故事ID | 一个 | 220116 | 空 | 空 | | BTREE | | |
| 作者故事 | 0 | 故事作者 | 2 | 作者_id | 一个 | 220116 | 空 | 空 | | BTREE | | |
| 作者故事 | 1 | 作者_id | 1 | 作者_id | 一个 | 第2179章 空 | 空 | | BTREE | | |
| 作者故事 | 1 | 故事ID | 1 | 故事ID | 一个 | 220116 | 空 | 空 | | BTREE | | |
| 图片故事 | 0 | 初级 | 1 | 编号 | 一个 | 148902 | 空 | 空 | | BTREE | | |
| 图片故事 | 0 | 故事图片 | 1 | 故事ID | 一个 | 148902 | 空 | 空 | | BTREE | | |
| 图片故事 | 0 | 故事图片 | 2 | image_id | 一个 | 148902 | 空 | 空 | | BTREE | | |
| 图片故事 | 1 | 故事ID | 1 | 故事ID | 一个 | 148902 | 空 | 空 | | BTREE | | |
| 图片故事 | 1 | image_id | 1 | image_id | 一个 | 148902 | 空 | 空 | | BTREE | | |
| 分类 | 0 | 初级 | 1 | 编号 | 一个 | 257 | 空 | 空 | | BTREE | | |
| 分类 | 1 | 故事ID | 1 | 故事ID | 一个 | 257 | 空 | 空 | | BTREE | | |
| 分类 | 1 | 姓名 | 1 | 姓名 | 一个 | 128 | 空 | 空 | | BTREE | | |
| 分类 | 1 | 姓名 | 2 | 职位 | 一个 | 257 | 空 | 空 | 是 | BTREE | | |
| 故事 | 0 | 初级 | 1 | 编号 | 一个 | 962570 | 空 | 空 | | BTREE | | |
| 故事 | 1 | created_at | 1 | created_at | 一个 | 481285 | 空 | 空 | | BTREE | | |
| 故事 | 1 | 来源 | 1 | 来源 | 一个 | 4 | 空 | 空 | 是 | BTREE | | |
| 故事 | 1 | source_id | 1 | source_id | 一个 | 962570 | 空 | 空 | 是 | BTREE | | |
| 故事 | 1 | 类型 | 1 | 类型 | 一个 | 2 | 空 | 空 | | BTREE | | |
| 故事 | 1 | 状态 | 1 | 状态 | 一个 | 4 | 空 | 空 | | BTREE | | |
| 故事 | 1 | 类型状态 | 1 | 类型 | 一个 | 2 | 空 | 空 | | BTREE | | |
| 故事 | 1 | 类型状态 | 2 | 状态 | 一个 | 6 | 空 | 空 | | BTREE | | |
| 评论 | 0 | 初级 | 1 | 编号 | 一个 | 232559 | 空 | 空 | | BTREE | | |
| 评论 | 1 | 状态 | 1 | 状态 | 一个 | 6 | 空 | 空 | | BTREE | | |
| 评论 | 1 | 日期 | 1 | 日期 | 一个 | 232559 | 空 | 空 | | BTREE | | |
| 评论 | 1 | 故事ID | 1 | 故事ID | 一个 | 29069 | 空 | 空 | | BTREE | | |
| 图片 | 0 | 初级 | 1 | 编号 | 一个 | 147206 | 空 | 空 | | BTREE | | |
| 图片 | 0 | source_id | 1 | source_id | 一个 | 147206 | 空 | 空 | 是 | BTREE | | |
| 图片 | 1 | 职位 | 1 | 职位 | 一个 | 4 | 空 | 空 | | BTREE | | |
| 图片 | 1 | position_id | 1 | 编号 | 一个 | 147206 | 空 | 空 | | BTREE | | |
| 图片 | 1 | position_id | 2 | 职位 | 一个 | 147206 | 空 | 空 | | BTREE | | |
| 用户 | 0 | 初级 | 1 | 编号 | 一个 | 981 | 空 | 空 | | BTREE | | |
| 用户 | 0 | users_email_unique | 1 | 电子邮件 | 一个 | 981 | 空 | 空 | | BTREE | | |
+-----------------+------------+------------------ --+----------------+--------------+------------+------ --------+----------+--------+------+------------+-- --------+---------------+
选择
故事。*,
count(comments.id) 作为评论,
GROUP_CONCAT(DISTINCT users.id ORDER BY users.id SEPARATOR ';') AS authors_id,
GROUP_CONCAT(DISTINCT users.display_name ORDER BY users.id SEPARATOR ';') AS authors_display_name,
GROUP_CONCAT(DISTINCT users.url ORDER BY users.id SEPARATOR ';') AS authors_url,
GROUP_CONCAT(DISTINCT classifications2.name SEPARATOR ';') AS classifications_name,
GROUP_CONCAT(DISTINCT images.id ORDER BY images.position,images.id SEPARATOR ';') AS images_id,
GROUP_CONCAT(DISTINCT images.caption ORDER BY images.position,images.id SEPARATOR ';') AS images_caption,
GROUP_CONCAT(DISTINCT images.thumbnail ORDER BY images.position,images.id SEPARATOR ';') AS images_thumbnail,
GROUP_CONCAT(DISTINCT images.medium ORDER BY images.position,images.id SEPARATOR ';') AS images_medium,
GROUP_CONCAT(DISTINCT images.large ORDER BY images.position,images.id SEPARATOR ';') AS images_large
从
分类
INNER JOIN 故事
ON stories.id = 分类.story_id
LEFT JOIN 分类 AS 分类2
ON stories.id = classifications2.story_id
左加入评论
ON stories.id = comments.story_id
左连接 image_story
ON stories.id = image_story.story_id
左连接图像
ON images.id = image_story.`image_id`
INNER JOIN author_story
ON stories.id = author_story.story_id
INNER JOIN 用户
ON users.id = author_story.author_id
WHERE 分类。`name` LIKE 'Home:Top%'
AND stories.status = 1
GROUP BY stories.id
按空排序
更新 2:2013-04-14
我注意到另一件事。如果我不选择stories.content(LONGTEXT) 和stories.content_html(LONGTEXT),则查询会从0.015几秒下降到0.006几秒。现在我正在考虑是否可以不用它们content,content_html或者用其他东西代替它们。
我在上面的 2013-04-13 更新中更新了查询、索引和解释,而不是在这个更新中重新发布,因为它们是次要的和增量的。该查询仍在使用filesort. 我无法摆脱,GROUP BY但已经摆脱了ORDER BY。
更新 3:2013-04-16
根据要求,我从两者中删除了 stories_id INDEXES image_story,author_story因为它们是多余的。结果是解释的输出只发生了变化,表明发生了possible_keys变化。不幸的是,它仍然没有显示Using Index优化。
也更改LONGTEXT为TEXT现在正在获取LEFT(stories.content, 500),而不是stories.content在查询执行时间上产生了非常显着的差异。
+----+-------------+------------------+--------+-- ---------------+--------------+-------- --+--------------+------+-------------- -------------------------------------------------- ------+ | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 | +----+-------------+------------------+--------+-- ---------------+--------------+-------- --+--------------+------+-------------- -------------------------------------------------- ------+ | 1 | 简单 | 分类 | 参考 | 故事ID,姓名,姓名位置| 姓名 | 102 | 常量 | 10 | 使用索引条件;使用哪里;使用临时的;使用文件排序 | | 1 | 简单 | 故事 | eq_ref | 初级,状态 | 初级 | 4 | 分类.story_id | 1 | 使用位置 | | 1 | 简单 | 分类2 | 参考 | 故事ID | 故事ID | 4 | 故事.id | 1 | 使用位置 | | 1 | 简单 | 作者故事 | 参考 | 故事作者 | 故事作者 | 4 | 故事.id | 1 | 使用哪里;使用索引 | | 1 | 简单 | 用户 | eq_ref | 初级 | 初级 | 4 | author_story.author_id | 1 | 使用位置 | | 1 | 简单 | 评论 | 参考 | 故事ID | 故事ID | 8 | 故事.id | 8 | 使用哪里;使用索引 | | 1 | 简单 | 图片故事 | 参考 | 故事图片 | 故事图片 | 4 | 故事.id | 1 | 使用索引 | | 1 | 简单 | 图片 | eq_ref | PRIMARY,position_id | 初级 | 4 | image_story.image_id | 1 | 空 | +----+-------------+------------------+--------+-- ---------------+--------------+-------- --+--------------+------+-------------- -------------------------------------------------- ------+ innodb_buffer_pool_size 134217728 TABLE_NAME INDEX_LENGTH image_story 10010624 image_story 4556800 图片故事 0 TABLE_NAME INDEX_NAMES 大小 黎明/image_story story_image 13921