Mariadb数据库关于Count统计的性能问题

jccsxx · 2019-09-15 22:05:28 · 1980 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-09-15 22:05:28 的主题,其中的信息可能已经有所发展或是发生改变。

我的语句是这样的

select count(*) as t from site where islook>0 and lang='zh'

我的网站是 https://887d.com/

数据库是Mariadb兼容Mysql

我把islook设为索引,但是都不走,lang字段设为索引虽然走了,但没法提高性能。记录数30万,统计这个记录需要大概2秒。

怎么办?请高手指教.


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1980 次点击  
加入收藏 微博
13 回复  |  直到 2019-09-17 16:09:46
jccsxx
jccsxx · #1 · 6年之前

有高手吗

focusonline
focusonline · #2 · 6年之前

楼主确定自己不是来做网站推广的? mysql系的数据库其实走不走索引完全看心情... 它的优化器不行的. 你的islook是否是个布尔变量? 如果是的话,索引基本没用不会走的. lang的话是否绝大多数记录都是zh? 这样的话索引就算走也没用的. 30W的记录统计一个count都需要2秒... 我觉得你需要考虑换一个稳定版本或者换用数据库.

jccsxx
jccsxx · #3 · 6年之前

2楼 @focusonline 不是广告,不信给你看一下我的页面,https://887d.com/sort?country=CN 下面有执行时间显示,昨天朋友帮我做了一下优化好多了,但还是长。你的意思是换数据库,但我不熟悉呀,时间成本太高。换成pgsql吗?

focusonline
focusonline · #4 · 6年之前
jccsxxjccsxx #3 回复

2楼 @focusonline 不是广告,不信给你看一下我的页面,https://887d.com/sort?country=CN 下面有执行时间显示,昨天朋友帮我做了一下优化好多了,但还是长。你的意思是换数据库,但我不熟悉呀,时间成本太高。换成pgsql吗?

你这优化过的版本还是很慢啊, 之前更慢? 这用户体验就太糟糕了.你朋友怎么帮你优化的? 我觉得你的问题可能不在数据库上. 我说的是两个选择,一个是换版本, 你可以继续用mariadb, 但是换一个更稳定的版本. 另外一个选择是换别的数据库, 比如换到mysql上或者pgsql. 你这个速度实在是慢的太夸张了.

jccsxx
jccsxx · #5 · 6年之前
focusonlinefocusonline #4 回复

#3楼 @jccsxx 你这优化过的版本还是很慢啊, 之前更慢? 这用户体验就太糟糕了.你朋友怎么帮你优化的? 我觉得你的问题可能不在数据库上. 我说的是两个选择,一个是换版本, 你可以继续用mariadb, 但是换一个更稳定的版本. 另外一个选择是换别的数据库, 比如换到mysql上或者pgsql. 你这个速度实在是慢的太夸张了.

慢就慢在这条统计语句上面,我需要知道我这个列表一共有多少记录,然后分页显示 select count(*) as t from site where islook>0 and lang='zh' 就这条,islook是表示大于0的状态,lang表示中国,英国之类的国家,怎么办?有办法吗?

jccsxx
jccsxx · #6 · 6年之前
focusonlinefocusonline #4 回复

#3楼 @jccsxx 你这优化过的版本还是很慢啊, 之前更慢? 这用户体验就太糟糕了.你朋友怎么帮你优化的? 我觉得你的问题可能不在数据库上. 我说的是两个选择,一个是换版本, 你可以继续用mariadb, 但是换一个更稳定的版本. 另外一个选择是换别的数据库, 比如换到mysql上或者pgsql. 你这个速度实在是慢的太夸张了.

换成pgsql一时不可能,等我学会换好,等多久. islook是数字字段,lang是varchar,我单加索引或二个全加索引也没用,我不知道怎么办了

focusonline
focusonline · #7 · 6年之前
jccsxxjccsxx #5 回复

#4楼 @focusonline 慢就慢在这条统计语句上面,我需要知道我这个列表一共有多少记录,然后分页显示 select count(*) as t from site where islook>0 and lang='zh' 就这条,islook是表示大于0的状态,lang表示中国,英国之类的国家,怎么办?有办法吗?

提个建议不知道是不是可行, 我猜你原来是把islook lang分开单独列索引的,你把islook和lang做成复合索引看看效果如何? 只是尝试一下.

jccsxx
jccsxx · #8 · 6年之前
focusonlinefocusonline #7 回复

#5楼 @jccsxx 提个建议不知道是不是可行, 我猜你原来是把islook lang分开单独列索引的,你把islook和lang做成复合索引看看效果如何? 只是尝试一下.

好像是快了一倍,谢谢,但还是不够快,现在400ms左右。还有别的办法吗

focusonline
focusonline · #9 · 6年之前
jccsxxjccsxx #8 回复

#7楼 @focusonline 好像是快了一倍,谢谢,但还是不够快,现在400ms左右。还有别的办法吗

快了一倍不容易啊. 我这里观察了一下没有感觉到明显的迟钝, 我觉得现在这个样子已经可以接受了. 你具体的表结构是啥样的? 继续优化的余地应该不大了.

jccsxx
jccsxx · #10 · 6年之前
focusonlinefocusonline #9 回复

#8楼 @jccsxx 快了一倍不容易啊. 我这里观察了一下没有感觉到明显的迟钝, 我觉得现在这个样子已经可以接受了. 你具体的表结构是啥样的? 继续优化的余地应该不大了.

其它就是一些普通的字段,关键是通过这二个字段来查询出不同的内容。要是能在100ms以内就好了。伤脑紧呀。

jccsxx
jccsxx · #11 · 6年之前
focusonlinefocusonline #9 回复

#8楼 @jccsxx 快了一倍不容易啊. 我这里观察了一下没有感觉到明显的迟钝, 我觉得现在这个样子已经可以接受了. 你具体的表结构是啥样的? 继续优化的余地应该不大了.

表结构还有一个分类,分类是存在另一个表中,就是网站的类型比如军事,科技之类的,但这个没有影响到性能。select具体内容的时候可能因为有limit 0,10内容数量的限止也非常快,只要0.005ms。就是count统计时好像需要全表扫描,百度一下只能加索引能快些,然后就是把统计结果保存起来,但是统计结果类型非常多,比如islook>0,也有islook>1,也有不同国家等需要统计,所以缓存统计结果太杂了,也不是太好的办法。真想不好呀。

focusonline
focusonline · #12 · 6年之前
jccsxxjccsxx #11 回复

#9楼 @focusonline 表结构还有一个分类,分类是存在另一个表中,就是网站的类型比如军事,科技之类的,但这个没有影响到性能。select具体内容的时候可能因为有limit 0,10内容数量的限止也非常快,只要0.005ms。就是count统计时好像需要全表扫描,百度一下只能加索引能快些,然后就是把统计结果保存起来,但是统计结果类型非常多,比如islook>0,也有islook>1,也有不同国家等需要统计,所以缓存统计结果太杂了,也不是太好的办法。真想不好呀。

加索引是有讲究的. 你知道为啥我最后告诉你的方法可以提高一倍的速度吗? 那是因为引擎只扫描索引进行计数了而不是进行全表扫描. 你这个如果不是商业项目的话这样的结果我觉得已经可以接受了. 如果你要尽善尽美的话,那么最好找个专业的DBA帮你优化一下设计.

jccsxx
jccsxx · #13 · 6年之前
focusonlinefocusonline #12 回复

#11楼 @jccsxx 加索引是有讲究的. 你知道为啥我最后告诉你的方法可以提高一倍的速度吗? 那是因为引擎只扫描索引进行计数了而不是进行全表扫描. 你这个如果不是商业项目的话这样的结果我觉得已经可以接受了. 如果你要尽善尽美的话,那么最好找个专业的DBA帮你优化一下设计.

嗯嗯,我也是一边优化,一边全当学习。这个是我自己弄的项目,不是什么商业项目。谢谢你了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传