根据设计惯例 查询的时候主子表通过关键词字段关联查询 查询语句如下
select top a word a queryurl a irank a title a baiduurl a itraffic a itraffic b ibaiduindex from zibiao a
with(nolock)
inner join zhubiao b with(nolock) on a word=b word
where a queryurl=
order by b ibaiduindex desc a irank
发现速度很慢 快的时候瞬间 慢的时候长达几分钟 分析sql server的查询执行计划如下
分析这个执行计划图 主要资源开销是在主表的聚集索引查找 应该是子表根据网址找到关键词后 再到主表中查找关键词对应的指数的这一步比较耗时
因这 个表的更新频率非常高 以为是更新频率太快 导致索引效率降低 于是想到用数据库读写分离的方案 专门拿了一台备用服务器 通过发布订阅的方法 将这两张表发布到备用服务器上 专门在备用服务器上做查询 发现速度并没有得到提升
在csdn上发了一个讨论帖 网友讨论很热烈 sql server的很多版主都有参与讨论 给出的方案也很多 有人说是IO读写瓶颈 于是升级了下服务器 硬盘采用raid 的固态硬盘 内存更是升级到了 G 不过效果仍旧不明显 同样的语句 慢的时候还是需要几十秒
有网友给出的方案 是建议把主表字段放到子表冗余 以减少关联的资源消耗 再结合以上的执行计划图 确实瓶颈是在主表的的聚集索引查找上 于是单独执行了下子表的irank排序语句
select top a word a queryurl a irank a title a baiduurl a itraffic a itraffic from zibiao a
with(nolock)
where a queryurl=
order by a irank
发现执行速度非常快 几乎秒开了 当然irank字段上有建索引的
测试成功 于是将主表的ibaiduindex字段放到子表冗余 并且建立好索引(这里的索引建立是有技巧的) 执行语句
select top a word a queryurl a irank a title a baiduurl a itraffic a itraffic a ibaiduindex from zibiao a
with(nolock)
where a queryurl=
order by a ibaiduindex desc a irank
查询瞬间出来结果 执行计划如下
这里拿以上这个sql语句来分析 我们该如何建立索引 索引建立包括字段的先后顺序 字段的排序方法 include项都很重要 任何一个弄错 都不能达到好的优化效果
我们肯定需要建立一个组合索引 那么应该组合字段用哪几个呢这里我的组合字段是 queryurl(这个字段第一 因为我们最先是根据这个字段进行筛选的) ibaiduindex irank
这里要注意下 因为我的固定排序就是ibaiduindex desc irank asc 所以字段的排列顺序应该是 queryurl ibaiduindex irank 同时排序的类别是 ibaiduindex desc irank asc 这里我一开始没注意 ibaiduindex的排序是asc 结果发现执行上面那个SQL语句仍然需要 秒
索引包含项 也很重要 如果不用包含项 索引查找到主键后 还要根据主键去查找其他字段 所以我们需要设置索引包含性列 把除掉索引字段中剩余的其他字段都加进去
lishixinzhi/Article/program/SQLServer/201311/22262
第一优化你的sql和索引;
第二加缓存,memcached,redis;
第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;
第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;
第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;
第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;
mysql数据库一般都是按照这个步骤去演化的,成本也是由低到高;
字节跳动万亿级图数据库ByteGraph架构挺好的。
北京字节跳动的发展:
2021年6月21日,字节跳动全资子公司入股上海斓星网络科技有限公司。
2021年6月30日,北京字节跳动科技有限公司全资子公司的北京吉云互动科技有限公司入股合肥皖音智服科技有限公司。
2021年8月报道,字节跳动将以50亿元人民币收购VR初创企业Pico。
字节跳动的全球化布局始于2015年 ,“技术出海”是字节跳动全球化发展的核心战略,其旗下产品有今日头条,西瓜视频,抖音,火山小视频,皮皮虾,懂车帝,悟空问答等。
千万级数据检索,主要应该在数据库方面处理。
但单独的数据库服务器肯定是不行的,需要使用服务器集群,并且把所需数据尽量放置到内存中来。
最好的解决方案是采购MY SQL集群,每台服务器内存8G以上(这不算奢侈的配置),这样在几十台服务器以上之后就可以响应了。
当然更全面的还需要考虑中国的国情,注意网通与电信之间的瓶颈问题的处理。
希望能帮到你。
以上就是关于sql server 2008亿万数据性能优化全部的内容,包括:sql server 2008亿万数据性能优化、mysql数据库千万级得表一下查询超时怎么优化、字节跳动万亿级图数据库ByteGraph架构是怎样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)