mysql的复杂sql(有group by ) 只能建立temptable视图, 查询很慢, 怎么解决?

maikuraki196320 2015-01-26 01:15:52
1, 前提:
①该建的索引我都建了.
②其中billing_demond_result的有10W的数据.
2, 建立索引语句:

DELIMITER $$
USE `weipaike`$$
DROP VIEW IF EXISTS `vw_billing_user_charge`$$
CREATE ALGORITHM=MERGE DEFINER=`mydb`@`%` SQL SECURITY DEFINER VIEW `vw_billing_user_charge` AS
SELECT
`a`.`phone` AS `phone`,
`a`.`province` AS `province`,
`a`.`city` AS `city`,
`a`.`regtime` AS `regtime`,
`a`.`channel` AS `channel`,
(COUNT(`b`.`phone`) + IFNULL((SELECT COUNT(0) FROM `billing_demond_result` WHERE (`billing_demond_result`.`phone` = `a`.`phone`) GROUP BY `billing_demond_result`.`phone`),0)) AS `total_cnt`
FROM (`billing_id` `a`
LEFT JOIN `billing_result` `b`
ON ((`a`.`phone` = `b`.`phone`)))
WHERE (1 = 1)
GROUP BY `a`.`phone`$$
DELIMITER ;

3, 建立后:
①会有"不能建立merge视图的警告", 然后自动转成temptable视图;
②使用SELECT * FROM vw_billing_user_charge LIMIT 100. 会耗时10S. 太慢了.
4, 问:
请教大家该如何优化, 谢谢!
PS:
①若不建立视图, 直接执行sql, 则很快(0.2S就搞定), 原因:走索引, 而且不需要全表查.
②若建立视图, 通过视图的来查询, 则很慢(>10S才能搞定), 原因:虽然走索引, 但因为只能建立ALGORITHM=TEMPTABLE视图, 所以视图的数据得全表全部查询出来, 所以整体才查询会很慢
...全文
420 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
maikuraki196320 2015-01-27
  • 打赏
  • 举报
回复
不知道这是不是mysql数据库的瓶颈, 若没办法的话, 可能就得考虑用物化视图了, 但Mysql本身没这功能, 还得自己建立写 触发期, 非常费时也影响效率
maikuraki196320 2015-01-27
  • 打赏
  • 举报
回复




走了索引的, 挫者自己认为应该是 temptable的原因照成查询慢
ACMAIN_CHM 2015-01-26
  • 打赏
  • 举报
回复
贴出 show index from ... 及 explain select ... 以供分析。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧