云霄房屋出租,武侠电影下载,鸡爪槭
1、数据库
垂直拆分:根据业务把表放到不同的数据库,解决表之间的io竞争
水平拆分:根据某种规则把单表数据分成多张表存储,解决单表数据量大的问题
索引:根据业务场景创建合理的索引,如果数据量很小建议使用索引(300条以内)
索引使用场景:
动作描述 |
聚集索引 |
非聚集索引 |
主键列 |
是 |
是 |
外键列 |
是 |
是 |
列经常被分组排序 |
是 |
是 |
返回某范围内的数据 |
是 |
否 |
一个或极少不同值 |
否 |
否 |
小数目的不同值 |
是 |
否 |
大数目的不同值 |
否 |
是 |
频繁更新的列 |
否 |
是 |
频繁修改索引列 |
否 |
是 |
分离活跃数据:把常用的数据和不常用的数据分离,例如活跃用户和不活跃用户
读写分离:写用主库,读用从库
其它:表结构优化、sql语句优化
2、缓存
读数据时先从缓存中取,命中不到再读库
3、集群
使用hadoop做集群,可以同时处理相同的数据
1、硬件
集群:多台服务器分流 ,静态资源集群和动态资源集群,需要考虑session同步问题
cdn:使用cdn存放静态资源
反向代理:用别的服务器代理处理
2、软件
动静分离:静态资源和动态资源分离,把静态资源放到单独的服务器
页面缓存:经常访问的页面可以做成静态页面放到缓存里
缩短请求路径:缩短请求服务的路径,便于解析
批量读取:多个请求合并到一起请求,减少数据库访问次数
延迟修改:把多次修改请求先放到缓存中,然后同步到库
sql语句优化:
select * from record where substring(card_no,1,4)=’5378’
应改为:
select * from record where card_no like ‘5378%’
select member_number, first_name, last_name from members
where datediff(yy,datofbirth,getdate()) > 21
应改为:
select member_number, first_name, last_name from members
where dateofbirth < dateadd(yy,-21,getdate())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
select sum(t1.c1)from t1 where(
(select count(*)from t2 where t2.c2=t1.c2>0)
select sum(t1.c1) from t1where exists(
select * from t2 where t2.c2=t1.c2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。
如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用exists代替。如:
if (select count(*) from table_name where column_name = 'xxx')
可以写成:
if exists (select * from table_name where column_name = 'xxx')
经常需要写一个t_sql语句比较一个父结果集和子结果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:
select a.hdr_key from hdr_tbl a---- tbl a 表示tbl用别名a代替
where not exists (select * from dtl_tbl b where a.hdr_key = b.hdr_key)
select a.hdr_key from hdr_tbl a
left join dtl_tbl b on a.hdr_key = b.hdr_key where b.hdr_key is null
select hdr_key from hdr_tbl
where hdr_key not in (select hdr_key from dtl_tbl)
三种写法都可以得到同样正确的结果,但是效率依次降低。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论