数据库的优化

一、搜索引擎的选择

  为不同的业务表选择不同的存储引擎,例如:查询插入操作多的业务表,用 MyISAM。临时数据用
Memeroy。常规的并发大更新多的表用 InnoDB。

二、分区或者分表

交易历史表:在年底为下一年度建立 12 个分区,每个月一个分区。
渠道交易表:分成当日表;当月表;历史表,历史表再做分区。

三、字符类型

变长情况下,varchar 更节省空间,但是对于段字段,需要一个字节来记录长度比如固定长度的用 char,不要用 varchar

四、非空

非空字段尽量定义成 NOT NULL,提供默认值
NULL 类型的存储、优化、使用都会存在问题

五、不要用外键、触发器、视图

降低了可读性,影响数据库性能,应该把把计算的事情交给程序,数据库专心做存储数据的完整性应该在程序中检查

六、不要用数据库存储图片(比如 base64 编码)或者大文件

把文件放在 NAS 上,数据库只需要存储 URI(相对路径),在应用中配置 NAS 服务器地址

七、表拆分:将不常用的字段拆分出去,避免列数过多和数据量过大。

比如重账控制表的 clob 报文,可以建立一张表专门用来存储报文。

八、表冗余:避免关联查询

数据库的优化

主从复制===读写分离:

  基于主从复制实现读写分离,所有的读请求都走从库,所有的写请求都走主库。这样可以减少单台服务器的并发压力。主从复制是怎么实现的呢?在第一节课我们说过,基于 binlog,从服务器会获取主服务器的 binlog 文件,然后解析里面的 SQL 语句,在从服务器上面执行一遍,保持数据一致。
  读写分离可以一定程度低减轻数据库服务器的访问压力,但是需要注意主从数据一致性的问题。当单台机器或者单表存储的数据过大的时候,单表的查询性能还是会下降,我们要进一步对单台机器的数据分型拆分,这个就是分库分表。

分库分表===垂直---水平

  垂直分库:减少并发压力。水平分表,解决存储瓶颈。垂直分库的做法,把一个数据库按照业务拆分成不同的数据库:

     水平分库:水平分库分表的做法,把单张表的数据按照一定的规则分布到多个数据库。分库分表以后的多数据源的问题,也可以通过中间件解决

 

哪些情况或字段适合加索引

1.在经常需要搜索的列上,可以加快索引的速度
2.主键列上可以确保列的唯一性
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的 distinct 列上加索引 可以加快排序查询的时间,

哪些情况不适合创建索引
 
1.查询中很少使用到的列 不应该创建索,如果建立了索引然而还会降低 mysql 的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较,mysql 需要扫描的行数很多,增加索引,并不能提高效率
,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系。

哪些情况会造成索引失效

1.如果条件中有 or,即使其中有条件带索引也不会使用(这也是为什么尽量少用 or 的原因)
2.索引字段的值不能有 null 值,有 null 值会使该列索引失效
3.对于多列索引,不是使用的第一部分,则不会使用索引(最左原则)
4.like 查询以%开头
5.如果列类型是字符串,那一定要在条件中将数据使用单引号引用起来,否则不使用索引
6.在索引的列上使用表达式或者函数会使索引失效
例如: select * from users where YEAR(adddate) < 2007,将在每个行上进行运算,这将导致索引失效而进
行全表扫描,因此我们可以改成: select * from users where adddate < ’2007-01-01