常见的数据库优化方法

对于后端开发人员来说,经常会和数据打交道,所以数据库的优化很重要,今天总结下部分数据库的优化知识。主要可以通过以下几种方式对数据库进行优化:

性能优化

  • 表的设计合理化,符合三大范式(3NF)
    • 1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
    • 2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
    • 3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。
  • 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
    • 较频繁的作为查询条件字段应该创建索引;
    • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;
    • 更新非常频繁的字段不适合创建索引
    • 不会出现在WHERE子句中的字段不该创建索引
  • 分表技术(水平分割、垂直分割);
  • 读写[写: update/delete/add]分离;
  • 存储过程 [模块化编程,可以提高速度];
  • 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ];
  • mysql服务器硬件升级;
  • 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)。

SQL语句优化

  • 通过show status命令了解各种SQL的执行频率;
  • 定位执行效率较低的SQL语句-(重点select;
  • 通过explain分析低效率的SQL;
  • 确定问题并采取相应的优化措施。

添加索引

  • 索引主要可以分为以下几种:
    • 主键索引,主键自动的为主索引 (类型Primary);
    • 唯一索引 (UNIQUE);
    • 普通索引 (INDEX);
    • 全文索引 (FULLTEXT) [适用于MyISAM] ——》sphinx + 中文分词 coreseek [sphinx 的中文版 ];
    • 综合使用=>复合索引
  • 可能使用到索引
    • 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
    • 对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引, ‘aaa%’ 会使用到索引。

 

  • 不使用索引
    • 如果条件中有or,即使其中有条件带索引也不会使用。
    • 对于多列索引,不是使用的第一部分,则不会使用索引。
    • like查询是以%开头
    • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’)
    • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

 

  • 作者:谭庆波
    链接:https://www.zhihu.com/question/36431635/answer/381557352
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

数据库优化分三个等级。

第一级就是常见的简单DDL DML调优。SQL写的好不好啊,group by order by对不对啊,select别用*,记得要要hit index啊。数据库表设计好点啊,主键外键索引啊,执行计划看一看啊。市面上九成九的数据库调优都在这。

 

第二级是DBA层级调优。MSSQL,ORACLE,MYSQL都各自有几十项配置。在不同的应用场景下需要针对性调整。比如MSSQL 的MAXDOP在有高并发且大SQL的情况下要适当调整限制,而全部是小SQL的情况下可以设置为无限。比如ORACLE的自动优化器在SQL性状相似的时候不开也没太大问题,CPU超过16个core的时候,parallel hint到底设置为几。这些都是学问。都没个定数,都是要DBA拿实际生产数据套研究的。oracle的AWR, entierprise manager, MSSQL的一堆管理SP,trace log,都是必读项。到这层,已经是每个公司每百程序员1,2个人的事情了。

 

最后一级是数据库中间件和infra层级调优。上个月我处理过一个MSSQL集群死慢死慢,但是单node就没问题。后来查出来是windows 集群的仲裁设置有问题,导致太频繁failover,虽然failover号称无缝,但是实际上还是有10秒左右数据库无法访问的。这一级,基本上是千人以上的公司才会遇到的问题,也就几个人懂,但凡其中有2个人同时休假,就歇了

作者:萝魏紫
链接:https://www.zhihu.com/question/36431635/answer/489961019
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(数据库,数据库性能优化)