我正在使用 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