Fork me on GitHub

数据库性能调优

数据库性能调优

当数据库的数据量非常大时,水平切分和垂直拆分是两种常见的降低数据库大小,提升性能的方法。无论是数据库还是架构设计不是追求最快而是追求可控!

垂直拆分

垂直拆分是指,将一个属性较多,一行数据较大的表,将不同的属性拆分到不同的表中,以降低单库(表)大小,达到提升性能的目的的方法。其实这种方式也就是空间换时间,垂直切分后,各个库(表)的特点是:

(1)每个库(表)的结构都不一样

(2)一般来说,每个库(表)的属性至少有一列交集,一般是主键

(3)所有库(表)的并集是全量数据

拆分的种类

元数据表
  • 元数据表,一般不会变动的数据,称为元数据,比如用户的年龄、性别;这种表一般以 data_ 作前缀。对于这种应遵循的原则:只增不减、只增不改。
索引技术(自己创建索引表)
  • 索引表:高频查询的时候必须要用的,一般以 index_ 作为前缀。

假设user表有几千万数据,而且是高频查询,以下是元数据信息。假如我们要查询name='张三' name='李四' name='王五' .....等,常规的查询方式可能是:

select * form data_user where name in('张三','李四',......)

`
data_user(uid bigint,name varchar(16),pass varchar(16),
age int,sex tinyint,flag tinyint,…);
`

当数据量过大,这种方式肯定不可取。一般我们会采取索引技术,创建一个索引表:

`
 index_user(id bigint,uid bigint,name varchar)  
`

如上,我们会把所有作为条件的字段加入到索引表并加上索引。(索引表的数据可以采用异步服务或是消息队列进行同步)查询的时候先查询索引表中指定索引字段,然后找到uid,再到user表根据uid查询;一般数据量过大的情况下,我们会对数据库作水平切分,这样用户的数据可能散落到不同的数据库,我们完全可以分开异步查询,然后再对结果汇总,如下

`
select uid from index_user where name='张三'
select * from data_user where uid=*
`
逻辑表
  • 这种表在多对多关系中常用的,一般以 logic_ 为前缀。
关系表
  • 这种表在多对多关系中常用的,一般以 rel_ 为前缀。
统计表
  • 毫无疑问在数据统计分析中常用的表,一般以 count_ 为前缀。

 

 

全表扫描:  

name like %name 和 name like %name% 都会造成索引失效,全表扫描
使用Or的时候(除非所有or的都加索引)
需要类型转换
复合索引未用左列字段

 



posted @ 2018-07-24 15:46  迁梦余光  阅读(231)  评论(0编辑  收藏  举报