MySQL性能管理及架构设计:数据库结构优化、高可用架构设计、数据库索引优化
一、数据库结构优化(非常重要)
1.1 数据库结构优化目的
1、减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余;
2、尽量避免数据维护中出现更新,插入和删除异常:
总结:要避免异常,需要对数据库结构进行范式化设计。
3、节约数据存储空间。
4、提高查询效率。
1.2 数据库结构设计步骤
1、需求分析:全面了解产品设计的存储需求、数据处理需求、数据安全性与完整性;
2、逻辑设计(重要):设计数据的逻辑存储结构。数据实体之间的逻辑关系,解决数据冗余和数据维护异常。数据范式可以帮助我们设计;
3、物理设计:表结构设计,存储引擎与列的数据类型;
4、维护优化:索引优化、存储结构优化。
1.3 数据库范式设计与反范式化
传送门:数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩
1.4 物理设计
相关传送门:MySQL中字段类型与合理的选择字段类型;int(11)最大长度是多少?,varchar最大长度是多少
二、高可用架构设计
2.1 读写分离
MaxScale:实现MySQL读写分离与负载均衡的中间件利器
三、数据库索引优化(非常重要)
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))
3.3.3 联合索引策略
如何选择索引列的顺序:
1、经常会被使用到的列优先(选择性差的列不适合,如性别,查询优化器可能会认为全表扫描性能更好);
2、选择性高的列优先;
3、宽度小的列优先(一页中存储的索引越多,降低I/O,查找越快);
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
扩展阅读: MySQL索引背后的数据结构及算法原理
explain 查询计划
Using where:表示优化器需要通过索引回表查询数据;
Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表,如覆盖索引;
学习视频:http://www.roncoo.com/course/list.html?courseName=mysql

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Hadoop时代的大数据技术思考:数据即服务
1. Hadoop 的神话正在破灭 IBM leads BigInsights for Hadoop out behind barn. Shots heard IBM has announced the retirement of the basic plan for its data analytics software platform, BigInsights for Hadoop. The basic plan of the service will be retired in a month, on December 7 of this year. “IBM把BigInsights for Hadoop牵到牧棚后面,只听一声枪响…” 这个是前不久英国知名媒体The Register对IBM 产品BigInsights产品下线的报道。 BigInsights 是IBM在Apache Hadoop上增加了不少IBM分析技术能力后形成的一个大数据分析产品。 在面临近乎2年的前途未卜的窘境之后,IBM终于决定将其关闭。 无独有偶,前不久Gartner的一篇文章也指出 “70%以上的H...
-
下一篇
RPC 服务框架 Dubbo 将正式得到官方维护与支持
近日,Dubbo 项目官网更新了一则公告: 在项目GitHub 主页的 issue 中,也有阿里巴巴的工程师确认了这一消息。 看来,Dubbo 确实重新开始得到官方的维护了。不过,目前还没发现项目的最新规划图,所以暂不了解 Dubbo 后续的发展方向如何。我们将持续保持关注。 Dubbo |ˈdʌbəʊ| 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 Dubbo能做什么? 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现,不再...
相关文章
文章评论
共有0条评论来说两句吧...