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

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

时间:2022-11-16 10:34:53浏览次数:62  
标签:架构设计 Hash name 数据库 查询 索引 优化 前缀


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

1.1 数据库结构优化目的

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

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



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



范式化设计​。

3、节约数据存储空间。

4、提高查询效率。

1.2 数据库结构设计步骤

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

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

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

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

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

ref=">传送门:数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩

1.4 物理设计



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





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





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



f=">相关传送门:MySQL中字段类型与合理的选择字段类型;int(11)最大长度是多少?,varchar最大长度是多少

二、高可用架构设计



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





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



2.1 读写分离



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



​MaxScale:实现MySQL读写分离与负载均衡的中间件利器​

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

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

3.1.1 B-tree结构



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



B-tree索引的限制:



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



3.1.2 Hash结构



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



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` )


  1. 普通索引:最基本的索引,没有任何限制
  2. 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
  3. 主键索引:它 是一种特殊的唯一索引,不允许有空值。
  4. 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
  5. 组合索引:为了更多的提高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 索引列上不能使用表达式和函数



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



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))​



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



如何选择索引列的顺序:

选择性​差的列不适合,如性别,查询优化器可能会认为全表扫描性能更好);

选择性高​的列优先;

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

3.3.3 组合/联合索引策略

最左前缀​法则。指的是查询从索引的最左前列开始并且不跳过索引中的列
​​"http://www.uml.org.cn/sjjm/201107145.asp#nav-4-2">深入理解请移步:最左前缀原理与相关优化

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所限制);

​​mysql高效索引之覆盖索引​​

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

全值匹配我最爱,最左前缀要遵守;​​
​​带头大哥不能死,中间兄弟不能断;​​
​​索引列上不计算,范围之后全失效;​​
​​LIKE百分写最右,覆盖索引不写 *;​​
​​不等空值还有or,索引失效要少用;​​
​​字符单引不可丢,SQL高级也不难 ;

​​MySQL高级-索引优化​​

3.4 使用索引来优化查询

3.4.1 利用索引排序

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

升序、降序)和Order By子句完全一致;

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

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

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

3.5 索引的维护和优化

3.5.1 删除重复索引



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



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

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

3.5.2 删除冗余索引



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



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

​​ef="​​http://www.uml.org.cn/sjjm/201107145.asp#nav-4-2​​">扩展阅读: MySQL索引背后的数据结构及算法原理

explain 查询计划Using where:表示优化器需要通过索引回表查询数据;
Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表,如覆盖索引;

ref="​​https://zhuanlan.zhihu.com/p/74826503​​">下一篇:MySQL性能管理及架构设计(三):SQL查询优化、分库分表 - 完结篇

原作者::唐成勇


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


标签:架构设计,Hash,name,数据库,查询,索引,优化,前缀
From: https://blog.51cto.com/u_15706988/5855035

相关文章

  • InfluxDb 时序数据库
    1.简述时间序列数据:从定义上来说,就是一串按时间维度索引的数据。时序数据库(TSDB)特点:持续高并发写入、无更新;数据压缩存储;低查询延时。常见TSDB:influxdb、opents......
  • SQLite 翻页功能优化
    好久没有接触数据库了,最近因为工作的原因,又开始在Qt上使用数据库,这次主要用的是Qt自带的sqlite,使用方便简单。项目需求:需要实时存储网络报文数据,并能实时查询,查询时要求......
  • 3 django 配置mysql数据库
    1.MYSQL安装https://blog.csdn.net/qq_59636442/article/details/123058454数据库密码:123456端口号和用户名输入密码,点击check......
  • CentOS7_Oracle12C 安装非容器数据库
    Oracle12C安装非容器数据库1.安装环境准备1.1条件准备Oracle安装包:linuxx64_12201_database.zipSSH远程工具:MobaxVMware虚拟机:centos7.6(内存:2G,Swap:3G磁......
  • 8.0以上版本MySQL-Driver连接数据库
    一、URLURL解析变更`之前我的MySQL数据库驱动mysql-connector-java版本号为5.1.34,在升级成8.0.9-rc版本后,发现原来的连接方式报错了。故在这里记录一下新版本的MySQL......
  • 数据库锁
    加锁的目的对数据加锁是为了解决事务的隔离性问题,让事务之间相互不影响,每个事务进行操作的时候都必须先对数据加上一把锁,防止其他事务同时操作数据。提交或回滚事务会释......
  • 数据库事务相关
    1、数据库事务的基本概念数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务......
  • Nginx配置优化详解
    原文http://www.1000zx.cn/it/13526.html大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大......
  • 【建议收藏】15755字,讲透MySQL性能优化(包含MySQL架构、存储引擎、调优工具、SQL、索引
    0.目录1)MySQL总体架构介绍2)MySQL存储引擎调优3)常用慢查询分析工具4)如何定位不合理的SQL5)SQL优化的一些建议1MySQL总体架构介绍1.1MySQL总体架构介绍引言MySQL......
  • mysql数据库的备份
    linux备份使用python脚本,要求有python3和mysqldump脚本中保留时间有点问题,不会自动删除,后期再看vim/usr/bin/mysql_bakup.py#!/usr/bin/python36#-*-coding:ut......