zoukankan      html  css  js  c++  java
  • 数据库性能调优

    数据库性能调优

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

    垂直拆分

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

    (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的都加索引)
    需要类型转换
    复合索引未用左列字段



  • 相关阅读:
    kmp
    RMP
    p次方求和
    河南省之6 Metric Matrice
    表达式求值
    线段树
    办公软件试题
    河南省之6 遥控器
    三个水杯
    JLink + USBTO232 MINI作品
  • 原文地址:https://www.cnblogs.com/tianboblog/p/9360437.html
Copyright © 2011-2022 走看看