mysql 的一些事

关于高性能mysql

mysql是企业级开发最常使用数据存储工具,免费,开源,严格的权限和安全机制是大多数选择mysql的原因。此文档不会讲述具体的sql操作及三大范式还有各种设计机制,只论述如何提升mysql性能及其扩展性

1. mysql提升性能的几条参考建议

- 首先,数据库的设计在其概念中是先进行逻辑设计(业务逻辑),在进行物理设计(物理结构),可实际开发工作中,往往二者是同时进行的。这就必须考虑到在真实使用的时候是否能做到尽可能的减轻依赖关系(数据库中的某一字段依赖于其他字段),减少冗余字段(减少不必要的数据)。
​
- 第二,字符编码和字段长度限制尽可能选择最小的,如没有特殊字符,表情等尽量使用utf8,而不是utf8mb4,一定不要使用blog(存储二进制图片)字段,text字段视情况来使用
​
- 第三,mysql的索引和外键。mysql的读取性能可以说是极大的依赖于索引,而mysql之间数据的完整性和一致性极大的依赖于外键,可二者都有一个共性的问题,就是对于数据的存储有很大的影响,尤其是索引,在数据的插入时会先计算插入的数据是否会与已存在的数据产生冲突,然后再插入,然后再赋给插入值相应的索引。而外键的插入,mysql会逐层的检查数据的一致性,耗时较多,如果是频繁插入数据的应用或者功能或者接口,使用时需要衡量一下得失。
​
- 第四 数字类型存储尽可能使用有符号数,存储的空间会减少一半,无符号数的存储会分配正负两给方向相同的空间,如果是无符号数,就只分配对应所申请的空间的大小。
​
- 第五 数据的存储尽可能做到冷热分离,也就是经常查询的数据字段放在一个表中,不常查询的字段,单独放在其他的表中。
​
- 第六 关于字段的选用。 金钱的计算尽可能使用decimal类型(对应Django为decimalfield)进行存储(不会丢失精度!);尽可能的避免枚举类型, enum的查询使用的alter是容易产生冲突和锁现象;值为null的尽量存储为0,防止索引失效。
​
- 第七 查询语句优化。 避免使用自查询(select * from table),多表关联的查询尽量使用join(Django就是使用了left join),可以利用索引加快查询速度;若需要对查询出的数据进行的随机排序,则尽量不用mysql的order by rander方法(耗时),可直接取出后,使用后端语言的random方法
​

2. mysql分片分区的使用

mysql分片:分布式数据库中数据的存储单位成为片段。对全局数据库的划分叫做分片。划分的结果就是片段。每个片段可以保存在一个以上的场地(服务器)。也就是在原有的mysql表、库的基础上设计出复制原则,并可单独存储(在分布式系统中经常使用)使用较少,不过多赘述。

分片的好处(优势):
    1、减少网络传输量
    
    2、增大事务处理的局部性
​
    3、提高数据的可用性和查询效率。
​
    4、负载均衡。
​
分片的原则:
    1、完备性:所有全局数据都要映射到某个片段上。
​
    2、可重构性:所有片段必须可以重新构成全局数据。
​
    3、不相交性:划分的个片段所包含的数据无交集。
    
分片的方法:
垂直分片和水平分片
    水平分片:水平分片是将数据按照元组来划分,在关系数据库中也就是根据属性的条件按照行划分,该属性叫做分片属性,条件就是分片条件。
    垂直分片:垂直分片是把一个关系表按照列来分成片段,各个片段之间除了主键外不能有交集。

mysql分区:首先分区是在逻辑上表现为一个表的,但是在实际的物理结构上,表现为多个表。对于历史数据的归档,不同类别的数据分类处理具有重要意义,是开发中经常用到的。

分区的本质:对于不同类别的数据,根据某个区分原则来分配到不同的表中进行存储。
​
使用分区表的优点:
    1、相对于单个文件系统或是硬盘,分区可以存储更多的数据(主要表现在数据的迁移);
​
    2、数据管理比较方便,比如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可(历史数据的查询和归档);
​
    3、精准定位分区查询数据,不需要全表扫描查询,大大提高数据检索效率(分区的意义就是将不同属性或者不同用途的数据进行分离,查询时需要遍历的总数据量更小);
​
    4、可跨多个分区磁盘查询,来提高查询的吞吐量(理论上可进行跨分区查询,但实际上没人会这么做,因为效率太低);
​
    5、在涉及聚合函数查询时,可以很容易进行数据的合并(暂未体会过);
​
分区的规则:一般来说,分区表字段的选择可以有多个,但是多数时候我们只选用一个,并且这个字段一定是数字类型的。
​
分区的方法:
    1. hash分区;根据字段的hahs值来决定数据存储到那个分区表中;
    
    2 range分区: 最最常用的分区,依照时间段进行分区,优点和好处显而易见,但是注意分区的范围不可重叠;
    
    3. list分区 按照自定义的分区列表进行分区, 分区list中的值不可重复,如数据对应不上分区list中的值,此次插入失败。

关于tornado,下次的技术文档在进行论述,由于tornado的学习深度还不够 -_- ,现在只学了一下他的基础应用和socket通信, 具体的异步机制远离还未研究,想必应该不同于python的yield(协程),不然也就没有必要出现tornado这个框架了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值