mysql数据库 程序做统计,运行很慢求助。

弧线球 2015-12-22 11:31:52
一个文章数据表,要根据 作者 来进行统计,文章表的作者字段不是单一作者,可能有好几个作者用json字符串保存。作者约有300多人有单独一个表。 读取作者表里面的记录,然后循环的用每个作者的id去查询文章表里面的作者字段,来统计作者的发布数。

原先文章表里面大概100多条记录,统计完300多个作者大约也就需要10秒不到。今天客户要求把老的文章导入,老文章大概17000多条。再运行统计页面的时候,页面要执行80来秒。我觉得太慢了,就决定用单独的一个表来存放历史文章。然后把文章表里面导入的记录删除掉,删除时表的最大id已经30000多了。删除完也就剩下100条记录,但是查询却依然还要50来秒,之前100度篇的时候也只要10来秒。有高手知道,这是什么原因吗? 如何解决
...全文
306 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-01-06
  • 打赏
  • 举报
回复
引用 15 楼 jesenkid 的回复:
[quote=引用 12 楼 yupeigu 的回复:] [quote=引用 11 楼 jesenkid 的回复:] [quote=引用 10 楼 yupeigu 的回复:] [quote=引用 8 楼 jesenkid 的回复:] [quote=引用 4 楼 yupeigu 的回复:] 删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?[/quote] 是这样的,在删除数据后,会有碎片,这个类似于你用windows 系统的时候,有个磁盘整理功能,可以加快你读取数据的效率。[/quote] 恩,我删除了15000条记录后,为什么查询耗时还是原来的时间,一点都没减少,碎片影响这么大吗?[/quote] 你把执行计划贴出来看看: explain select 。。。[/quote] explain select count(id) as countid from sqmy_article where status=4 and pishi<>'' and not isnull(pishi) and customers like '%"42":%' 结果 '1', 'SIMPLE', 'sqmy_article', 'ALL', NULL, NULL, NULL, NULL, '41', 'Using where'[/quote] 你这个用的是 where直接过滤的,没有用到索引,你试试更新一下统计信息: analyze table xx;
LongRui888 2015-12-31
  • 打赏
  • 举报
回复
引用 8 楼 jesenkid 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?[/quote] 是这样的,在删除数据后,会有碎片,这个类似于你用windows 系统的时候,有个磁盘整理功能,可以加快你读取数据的效率。
弧线球 2015-12-31
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
[quote=引用 11 楼 jesenkid 的回复:] [quote=引用 10 楼 yupeigu 的回复:] [quote=引用 8 楼 jesenkid 的回复:] [quote=引用 4 楼 yupeigu 的回复:] 删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?[/quote] 是这样的,在删除数据后,会有碎片,这个类似于你用windows 系统的时候,有个磁盘整理功能,可以加快你读取数据的效率。[/quote] 恩,我删除了15000条记录后,为什么查询耗时还是原来的时间,一点都没减少,碎片影响这么大吗?[/quote] 你把执行计划贴出来看看: explain select 。。。[/quote] explain select count(id) as countid from sqmy_article where status=4 and pishi<>'' and not isnull(pishi) and customers like '%"42":%' 结果 '1', 'SIMPLE', 'sqmy_article', 'ALL', NULL, NULL, NULL, NULL, '41', 'Using where'
弧线球 2015-12-31
  • 打赏
  • 举报
回复
300个用户,每个用户都有 5条类似 select count(id) as countid from sqmy_article where status=4 and pishi<>'' and not isnull(pishi) and customers like '%"42":%' 这样的统计语句 在一个php页面实现,我觉得 sqmy_article 删除记录后,肯定还有残余什么东西,导致了,查询变慢
弧线球 2015-12-31
  • 打赏
  • 举报
回复
explain select count(id) as countid from sqmy_article where status=4 and pishi<>'' and not isnull(pishi) and customers like '%"42":%' 结果 '1', 'SIMPLE', 'sqmy_article', 'ALL', NULL, NULL, NULL, NULL, '41', 'Using where'
LongRui888 2015-12-31
  • 打赏
  • 举报
回复
引用 11 楼 jesenkid 的回复:
[quote=引用 10 楼 yupeigu 的回复:] [quote=引用 8 楼 jesenkid 的回复:] [quote=引用 4 楼 yupeigu 的回复:] 删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?[/quote] 是这样的,在删除数据后,会有碎片,这个类似于你用windows 系统的时候,有个磁盘整理功能,可以加快你读取数据的效率。[/quote] 恩,我删除了15000条记录后,为什么查询耗时还是原来的时间,一点都没减少,碎片影响这么大吗?[/quote] 你把执行计划贴出来看看: explain select 。。。
弧线球 2015-12-31
  • 打赏
  • 举报
回复
引用 10 楼 yupeigu 的回复:
[quote=引用 8 楼 jesenkid 的回复:] [quote=引用 4 楼 yupeigu 的回复:] 删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?[/quote] 是这样的,在删除数据后,会有碎片,这个类似于你用windows 系统的时候,有个磁盘整理功能,可以加快你读取数据的效率。[/quote] 恩,我删除了15000条记录后,为什么查询耗时还是原来的时间,一点都没减少,碎片影响这么大吗?
ACMAIN_CHM 2015-12-30
  • 打赏
  • 举报
回复
以文本方式贴出 explain select ... show index from .. 以供分析。
文修 2015-12-30
  • 打赏
  • 举报
回复
跪求楼主结贴给分
弧线球 2015-12-30
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
碎片会影响查询速度是吧?比如我有20000条记录,我删了15000条,那查询的时候还是原来20000条的 时间。。这种情况用optimize table xxx 后,查询速度会变快吗?
弧线球 2015-12-30
  • 打赏
  • 举报
回复
引用 2 楼 u010587433 的回复:
这么点数据,还用10秒?也是够慢的。可能跟json格式有关。 1、整理下碎片试试,optimize table t; 2、看是否存在有效索引 另外,建议关系型数据库最好不使用json,多个作者的以多条记录的形式存在
之前100多条的搜索时间,大约是1秒左右,估计错误。。在php里用时间计算了下执行时间,300多个用户,大约0.4秒。就是数据多了以后,肯定会变慢。对的,是用like 加 %搜索的,记录多了肯定变慢。记录多了,就把文章移到历史表里面。恩,对的,用json的话,索引也没法做。下个项目可以考虑这么做
弧线球 2015-12-30
  • 打赏
  • 举报
回复
引用 1 楼 congya001 的回复:
楼主你好 请问你删除数据后是否回收了高水位,如果你的查询速度在删除前后没有大的变化的话,那肯定是没有 有些DBMS如Mysql表(innodb单表单文件)中数据被删除以后,文件大小不会被收缩,但是在做全表扫描时,对于没有数据的页是不会被扫描的,这一点和oracle的行为不一样,oracle只要对高水位线以下的块全部会扫描,而不管这些块里面是否有记录. 下面这篇文章希望能够帮到你 http://blog.chinaunix.net/uid-26805356-id-3450601.html
如何收回高水位,查询速度前后是没有变化。我delete了记录,但是搜索依然很慢。是不是这些被删除的记录,任然在起作用?
LongRui888 2015-12-30
  • 打赏
  • 举报
回复
另外,把执行计划打出来看看: explain select 。。。
LongRui888 2015-12-30
  • 打赏
  • 举报
回复
删除了会导致有大量的碎片的,你用找个试试: optimize table xxx
上海阿丽 2015-12-23
  • 打赏
  • 举报
回复
这么点数据,还用10秒?也是够慢的。可能跟json格式有关。 1、整理下碎片试试,optimize table t; 2、看是否存在有效索引 另外,建议关系型数据库最好不使用json,多个作者的以多条记录的形式存在
文修 2015-12-23
  • 打赏
  • 举报
回复
楼主你好 请问你删除数据后是否回收了高水位,如果你的查询速度在删除前后没有大的变化的话,那肯定是没有 有些DBMS如Mysql表(innodb单表单文件)中数据被删除以后,文件大小不会被收缩,但是在做全表扫描时,对于没有数据的页是不会被扫描的,这一点和oracle的行为不一样,oracle只要对高水位线以下的块全部会扫描,而不管这些块里面是否有记录. 下面这篇文章希望能够帮到你 http://blog.chinaunix.net/uid-26805356-id-3450601.html

56,679

社区成员

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

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