MariaDB社区
标题:
三表关联,查询中按聚合函数的结果排序,如何优化?
[打印本页]
作者:
沉睡的悟空
时间:
2011-10-27 10:44
标题:
三表关联,查询中按聚合函数的结果排序,如何优化?
一共三张表tips,tippings,comments。tippings 是中间表。tips 和 comments 是多对多的关系。tips只有两列:id,name
tippings 的create语句:
CREATE TABLE `tippings` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`tip_id` INT(11) NULL DEFAULT NULL,
`tippable_id` INT(11) NULL DEFAULT NULL,
`tipper_id` INT(11) NULL DEFAULT NULL,
`tipper_type` VARCHAR(255) NULL DEFAULT NULL,
`tippable_type` ENUM('Post','Comment') NULL DEFAULT NULL,
`context` ENUM('tips') NULL DEFAULT NULL,
`created_at` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `index_tippings_on_tip_id` (`tip_id`),
INDEX `index_tippings_on_tippable_id_and_tippable_type_and_tip_id` (`tippable_id`, `tippable_type`, `tip_id`),
INDEX `index_cttt` (`context`, `tippable_type`, `tippable_id`, `tip_id`)
)
复制代码
查询语句为:
SELECT tips.*, COUNT(*) AS count FROM `tips` LEFT OUTER JOIN tippings
ON tips.id = tippings.tip_id INNER JOIN
comments ON comments.id = tippings.tippable_id WHERE (tippings.tippable_type
= 'Comment') GROUP BY tips.id HAVING COUNT(*) > 0 ORDER BY
count desc LIMIT 75;
复制代码
tippings 目前800多万条记录。
查询速度太慢
怎么设置索引能使按那个聚合函数count(*) 排序时不产生 Using temporary,当然更改my.cnf当中tmp_table_size的大小先除外考虑。
各位帮忙看看能不能更好的优化下
作者:
沉睡的悟空
时间:
2011-10-27 12:44
看来无重赏,无勇夫了。哎,为之奈何??
作者:
kider
时间:
2011-10-31 09:49
首先表tippings里的索引重复严重,需要优化。
建议为,根据你实际情况再定:
INDEX `index_tippings_on_tip_id` (`tip_id`),
INDEX `index_tippings_on_tippable_id (`tippable_id),
INDEX `index_cttt` (`context`)
如果你确实需要GROUP BY tips.id HAVING COUNT(*) > 0(最好根据业务能优化掉) ,建议先对表tips做这样的操作,再和tippings 表 LEFT OUTER JOIN 效果较好。
然后多使用下explain看看执行计划。
作者:
my1bbs1
时间:
2016-2-2 10:15
看看
北京华盛癫痫病医院好吗
北京癫痫病专科医院排名
北京华盛癫痫病医院
昆明军海癫痫病医院
昆明军海医院怎么样
北京华盛癫痫病医院
北京华盛癫痫病医院
云南昆明军海医院
北京华盛医院怎么样
昆明军海癫痫病医院
北京华盛癫痫病医院
昆明军海癫痫病专科医院
欢迎光临 MariaDB社区 (http://123.56.88.72/)
Powered by Discuz! X3.2