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

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

1.1 数据库结构优化目的

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

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

b96801303e09ac5fa9ebfca030cac490.png

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

3、节约数据存储空间。

4、提高查询效率。

1.2 数据库结构设计步骤

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

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

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

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

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

1.4 物理设计

b05a26a9f9e40b38a10ec7a1b6e1aa34.png

48452fc4e57724913cebab166d1d4580.png

70375049a48b10c6afaaa84db8528c26.png

二、高可用架构设计

d7f8fd207f0a1ad87c3697acb8963be1.png

e1ebff50e769f9e8a0587477e19a9d48.png

2.1 读写分离

a63954abebd19aafe556ac568d3d37c4.png

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

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

3.1.1 B-tree结构

50354291334f20cfb6de96f431644bc0.png

B-tree索引的限制:

08be9d8aff9ce57ef36ec71aa80de5fd.png

3.1.2 Hash结构

44927d09f93a3e27e459f6e8a6902aee.png

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 索引列上不能使用表达式和函数

f5581f3e12361861120c8e187d96e746.png

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

8bf3c98a75968e5dca636bb97e1385be.png

如何选择索引列的顺序:

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 删除重复索引

124b3522607b08b824a5ea2eb48a737c.png

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

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

3.5.2 删除冗余索引

91e897aac7c2e5a8688fe798306acfe1.png

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

explain 查询计划

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python git是什么_python爬虫之git的使用

一、简单认识: 1、初始化文件夹为版本控制文件夹,首先建立一个文件夹,进入这个文件夹以后输入git init初始化这个文件夹。2、Git几种位置概念 1、本地代码:本地更改完代码以后,虽然是存放在git的文件夹里面&#xff0c…

产品经理网站数据分析之测量问题现状(二)

本章续接上文,主要讲解流程图的绘制要领,以及示例。 1、基础流程图 基础流程图应该简明扼要地描述出流程的主要结构,在弄清楚流程的起点、终点,以及主要步骤后,按照流程的先后顺序,按照要展示的流程长短比例…

yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置

你好,我是小桔,是一个没有感情的代码崽。今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一。本文环境:Git 版本&#xff1a…

Tiff – 值得你体验一下的可视化的字体对比工具

Tiff 是一款字体对比工具,可视化对比两种字体之间的差异。这是一个工具来帮助比较两种字体,同时学习排版。在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源。由于应用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此请…

[.NET] 建构子中传递子对象的对象

在设计对象继承的时候&#xff0c;父对象建构子会需要一些参数&#xff0c;这些参数可以由子对象建构子透过base关键词来提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

操作系统实验文件管理_系统设计硬核知识(5)——操作系统的文件管理

操作系统对计算机的管理包括两个方面&#xff1a;硬件资源和软件资源。硬件资源的管理包括CPU 的管理、存储器的管理、设备管理等&#xff0c;主要解决硬件资源的有效和合理利用问题。软件资源包括各种系统程序、各种应用程序、各种用户程序&#xff0c;也包括大量的文档材料、…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】...

今天爱分享给大家带来Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】&#xff0c;希望能够帮助到大家。 字典是 Python 语言中唯一的映射类型。映射类型对象里哈希键(键&#xff0c;key)和指向的对象&#xff08;值&#xff0c;value)是多对一的关系&am…

大网高级技术笔记(一)

防伪码&#xff1b;黑发不知勤学早&#xff0c;白首方悔读书迟本章目标&#xff1a;理解消化动态路由协议与OSPF协议并应用于实际工作中。第一章 动态路由协议一、按照路由执行的算法分类距离矢量路由协议&#xff1a;RIP、IGRP链路状态路由协议&#xff1a;OSPE、IS-IS二、RIP…

阿里MySQL读写一致_阿里面试题:如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸出处&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性…

反射小应用之DataTable和ListT互操作

反射小应用之DataTable和List<T>互操作 在程序中&#xff0c;往往会遇到一些小情况&#xff0c;就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中&#xff0c;这样做的一个后果是在日后的的对数据进行”细“操作时&#xff0c;就发现它可能没有L…

python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?

原标题&#xff1a;什么样的人比较适合选择Python开发人工智能技术&#xff1f; 互联网行业最近几年来确实成为了竞相追捧的行业&#xff0c;人工智能、大数据的不断发展让Python开发技术成为了继Java开发之后的又一热门编程语言。我们都知道&#xff0c;想要学习Python开发编程…

excel vba 从入门到精通_VBA词汇-基本元素篇

在公众号发布学习VBA需要哪些基础知识这篇文章后&#xff0c;有朋友给我们留言&#xff0c;希望可以出一份VBA基础的英语知识贴。其实相关的内容我们会在后面所对应知识点一一进行讲解&#xff0c;提前剧透其实会少很多学习未知知识的乐趣哦~ 我们会将所涉及的基础单词和其说明…

openfeign使用_Feign使用基于配置服务发现

之前写了篇《Feign在实际项目中的应用实践总结》Feign在实际项目中的应用实践总结 - 沐风之境 - 博客园​www.cnblogs.com总结了在一般项目中如何使用Feign这个提升开发效率的利器。最近在看Feign的文档的时候发现了之前遗漏的一些点&#xff0c;所以写了这篇文章进行补充。pom…

我笨,但我不傻

2019独角兽企业重金招聘Python工程师标准>>> 威哥说&#xff1a;很多朋友给我留言&#xff0c;在学习的过程中如何坚持下去&#xff0c;关于努力和目标&#xff0c;我想谈谈自己的理解&#xff0c;有不同见解的地方&#xff0c;欢迎留言跟我探讨哈。 if(努力苦逼) r…

(转)千万别熬夜:身体器官晚上工作时间表一览

原文连接&#xff1a;http://jiuyinguan.blog.163.com/blog/static/20907903720126801015713/ 任何试图更改生物钟的行为&#xff0c;都将给身体留下莫名其妙的疾病&#xff0c;20、30年之后再后悔&#xff0c;已经来不及了。 一、晚上9-11点为免疫系统&#xff08;淋巴&#x…

伯纳德•罗森伯格先生参加华为技术2016首届国际光电连接技术研讨会

近日&#xff0c;来自罗森伯格德国总部的CTO首席技术官伯纳德罗森伯格先生参加了由华为技术组织的2016首届国际光电连接技术研讨会。本届研讨会华为共邀请了来自全球的约十家著名光电技术领先厂家及合作伙伴参与&#xff0c;共同探讨未来数十年的光纤电子技术发展方向并分享最新…

如何使用python效率_Python的5中提高效率的用法

任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目&#xff0c;并在 stackoverflow 上寻找某个问题的答案。然后你突然发现了一个非常优雅的解决方案&#xff0c;它使用了你从不知道的 Python 功能&#xff01;这种学习方式太有趣了&…

Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

&#xff08;本文是基于老版本的VS和Xamarin&#xff0c;而VS2017已经集成了Xamarin&#xff0c;所以&#xff0c;本文已经过时&#xff0c;最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序 。&#xff09; 如果是.NET开发人员&#xff0c;想学习手机应用开发&#…

内网穿透 无需公网ip_无需端口映射、无需公网IP,60秒实现FTP服务远程访问

互联网的一大特点是实现信息共享&#xff0c;其中文件传输是信息共享十分重要的内容之一。科技公司更是离不开它。销售、库存、客户资料等等数据需要随时共享同步。当需要考虑到文件传输安全、传输质量、传输稳定性、访问控制等诸多因素时&#xff0c;FTP服务器就成了解决文件传…

Clojure:导入lein项目到IntelliJ IDEA

首先&#xff0c;我们需要先创建一个lein项目&#xff08;废话。。&#xff09; lein new [项目名称] 然后生成Maven的pom.xml文件 cd [项目目录]lein pom 最后&#xff0c;在InteliJ IDEA中选择导入Maven项目&#xff0c;选择刚刚生成的pom.xml文件即可。 转载于:https://www.…