一、数据库结构优化(非常重要)

1.1 数据库结构优化目的

1、减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余;

2、尽量避免数据维护中出现更新,插入和删除异常:

总结:要避免异常,需要对数据库结构进行范式化设计。

3、节约数据存储空间。

4、提高查询效率。

1.2 数据库结构设计步骤

1、需求分析:全面了解产品设计的存储需求、数据处理需求、数据安全性与完整性;

2、逻辑设计(重要):设计数据的逻辑存储结构。数据实体之间的逻辑关系,解决数据冗余和数据维护异常。数据范式可以帮助我们设计;

3、物理设计:表结构设计,存储引擎与列的数据类型;

4、维护优化:索引优化、存储结构优化。

1.3 数据库范式设计与反范式化

1.4 物理设计

二、高可用架构设计

2.1 读写分离

三、数据库索引优化(非常重要)

3.1 两种主要数据结构:B-tree和Hash

3.1.1 B-tree结构

B-tree索引的限制:

3.1.2 Hash结构

Hash索引的限制:

Hash索引必须进行二次查找

Hash索引无法用于排序

Hash索引不支持部分索引查找也不支持范围查找

Hash索引中Hash码的计算可能存在Hash冲突,不适合重复值很高的列,如性别,身份证比较合适。

3.1.3 MySQL常见索引和各种索引区别

PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`column`)

INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

FULLTEXT(全文索引) ALTER TABLE `table_name` ADD FULLTEXT ( `column` )

组合索引 ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

普通索引:最基本的索引,没有任何限制

唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。

主键索引:它 是一种特殊的唯一索引,不允许有空值。

全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。

组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

3.2 使用索引好处和索引缺陷

3.2.1 为什么要使用索引

1、索引大大减少了存储引擎需要扫描的数据量;

2、索引可以帮助我们进行排序以避免使用临时表;

3、索引可以把随机I/O变为顺序I/O。

3.2.2 索引不是越多越好

1、索引会增加写操作的成本;

2、太多的索引会增加查询优化器的选择时间。

索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,而有500页是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。

3.3 索引优化策略

3.3.1 索引列上不能使用表达式和函数

3.3.2 前缀索引和索引列的选择性

Innodb索引列最大宽度为667个字节(utf-8 差不多255个字符),MyIsam索引类宽度最大为1000个字节,于是出现前缀索引,索引的选择性。

对于列的值较长,比如BLOB、TEXT、VARCHAR,就必须建立前缀索引,即将值的前一部分作为索引。这样既可以节约空间,又可以提高查询效率。但无法使用前缀索引做 ORDER BY 和 GROUP BY,也无法使用前缀索引做覆盖扫描。

语法: ALTER TABLE table_name ADD KEY(column_name(prefix_length))

如何选择索引列的顺序:

1、经常会被使用到的列优先(选择性差的列不适合,如性别,查询优化器可能会认为全表扫描性能更好);

2、选择性高的列优先;

3、宽度小的列优先(一页中存储的索引越多,降低I/O,查找越快);

3.3.3 组合/联合索引策略

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

深入理解请移步:最左前缀原理与相关优化

3.3.4 覆盖索引策略

跟组合索引有点类似,如果索引包含所有满足查询需要的数据的索引则成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作。即索引的叶子节点上面包含了他们索引的数据(hash索引不可以)。

判断标准:使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。

优点:

1、可以优化缓存,减少磁盘IO操作;

2、可以减少随机IO,变随机IO操作变为顺序IO操作;

3、可以避免对InnoDB主键索引的二次查询;

4、可以避免MyISAM表进行系统调用;

无法使用覆盖索引的情况:

1、存储引擎不支持覆盖索引;

2、查询中使用了太多的列(如SELECT * );

3、使用了双%号的like查询(底层API所限制);

3.3.5 SQL索引优化总结口诀(套路重点)

全值匹配我最爱,最左前缀要遵守;

带头大哥不能死,中间兄弟不能断;

索引列上不计算,范围之后全失效;

LIKE百分写最右,覆盖索引不写 *;

不等空值还有or,索引失效要少用;

字符单引不可丢,SQL高级也不难 ;

3.4 使用索引来优化查询

3.4.1 利用索引排序

1、group by 实质是先排序后分组,遵照索引的最佳左前缀。;

2、索引中所有列的方向(升序、降序)和Order By子句完全一致;

3、当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置;

4、如果最左列使用了范围,则排序会失效;

5、where 高于having,能写在where限定的条件就不要去having去限定了

3.5 索引的维护和优化

3.5.1 删除重复索引

注:主键约束相当于(唯一约束 + 非空约束)

一张表中最多有一个主键约束,如果设置多个主键,就会出现如下提示:Multiple primary key defined!!!

3.5.2 删除冗余索引

检查工具:pt-duplicate-key-checker

explain 查询计划

Using where:表示优化器需要通过索引回表查询数据;

Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表,如覆盖索引;

mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...相关推荐

  1. Mysql数据库MMM实现高可用架构

    文章目录 一,MMM介绍 二.MMM搭建 一,MMM介绍 MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障 ...

  2. MySQL 数据库之 MMM 高可用架构构建

    文章目录 一.MMM 概述 1. 什么是 MMM 2. 应用场景 3. MMM 特点 4. 关于 MMM 高可用架构的说明 5. 用户及授权 二.案例环境 1. 服务器配置 2. 服务器环境 3. 修 ...

  3. MySQL高可用架构

    MySQL学习笔记 一,高可用架构 对于一个企业来讲,设计一个高可用的架构非常重要,包括前端的高可用和后端数据库的高可用.企业业务每暂停一分钟,可能会造成大量的金钱流失,因此只有在整个架构的设计上足够 ...

  4. ef mysql 优化_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  5. MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  6. mysql性能监控 调优_MySQL管理之道:性能调优、高可用与监控(第2版)

    MySQL管理之道:性能调优.高可用与监控(第2版) 作者:贺春旸 著 出版日期:2016年08月 文件大小:71.36M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iPad/iPho ...

  7. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

  8. 《MySQL性能优化和高可用架构实践》简介与推荐序

    #好书推荐##好书奇遇季#<MySQL性能优化和高可用架构实践>,京东当当天猫都有发售.腾讯云架构师宋立桓倾情奉献,定价59元,网店打折销售其实没多少钱. 互联网公司里面几乎很少有公司不用 ...

  9. mysql性能优化和高可用架构实践pdf_实践大于一切!Alibaba最新MySQL性能优化+高可用架构全彩版PDF...

    本篇的内容将会覆盖MySQL 5. 7数据库体系结构.InnoDB存储引擎.MySQL事务和锁.性能优化.服务器全面优化.性能监控.主从复制,以及PXC集群.MHA自动故障转移群集.MGR组复制.Ke ...

最新文章

  1. redis的学习使用,第二章
  2. Understanding Extension Class Loading--官方
  3. BF算法和KMP算法
  4. Python中的 optparse模块
  5. python读取Excel实例详细教程
  6. java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...
  7. liunx 环境下docker安装mysql
  8. Atitit.hibernate体系结构大总结
  9. 计算机无线键盘没反应,电脑怎么连接无线键盘 电脑连接无线键盘没反应怎么办...
  10. PS 进行隐藏图制作
  11. mysql怎么写外键支持级联删除_MySQL外键级联删除不起作用,完全难倒
  12. SEBank银行项目第一个星期的进度安排
  13. H5常见问题 微信踩过得坑
  14. Android权限 - 权限分类
  15. 【BSP视频教程】STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较
  16. 金融风控-贷款违约预测学习笔记(Part3:特征工程)
  17. 数字签名的作用和功能
  18. 莫烦python神经网络进化(NeuroEvolution)之最全篇
  19. Vue.js高效前端开发知识 • 【目录】
  20. SpringBoot---------Redis

热门文章

  1. python全栈开发_day10_函数的实参和形参
  2. bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案
  3. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)
  4. Android eclipse导入项目后出现Unable to resolve target #39;android-17#39;解决方法
  5. JLOI2016 方
  6. mysql 存储过程中limit
  7. ImportError: No module named 'chardet'
  8. Storm编程入门API系列之Storm的可靠性的ACK消息确认机制
  9. 测试人员报BUG的正确姿势
  10. JavaFX 的 UI 控件集 ControlsFX