一共三张表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_context` (`tippable_id`, `tippable_type`, `context`),
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, tips.name HAVING COUNT(*) > 0 ORDER BY
count desc LIMIT 75;
tippings 目前800多万条记录。
查询速度太慢
各位帮忙看看能不能更好的优化下
问题补充:
wxjiaaa 写道
表大了就不联表咯 各种子查询
谢谢,但关键是后两个表,不关联是拿不出结果的。所以,还是想着能不能优化一下索引。
问题补充:
asyty 写道
可以用多列索引
我已经用过复合索引了。index_tippings_on_tippable_id_and_tippable_type_and_context
而且这个索引建的还很合适。如果要改的话,也只是把它改为index_tippings_on_tippable_id_and_tippable_type_and_tip_id