Mysql优化策略

一、建表原则:

1、表的优化与类型选择

  (1)定长与变长相分离。

  (2)根据使用频率建立主表及副表(将不常用的字段放入副表中:比如用户表,将用户家庭地址等详细信息放入附表,当需要查询详情,再点击查询)。

(3)在满足数据库“三范式”的前提下,采用“反三范式”,合理加入冗余字段。该思路是以空间换时间,比如减少频繁求和、频繁级联等,保证系统性能。

2、列选择(数据类型选择)

(1)字段类型选择:整型>date,time>enum、char>varchar>blob、text。

(2)对于整型和char型,优先选择整型,比如采用整型或字符型表示性别时,优先选择tinyint型,因为选择char(1)可能会考虑到字符集和校对集。

(3)enum:内部采用整型存储,起到约束的作用。

(4)char与varchar:char定长,varchar不定长,虽然varchar会比char省空间,但是由于修改时会根据长度不同,会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,所以对于频繁修改的数据尽量使用char代替varchar,以确保性能。

二、索引优化(核心):

索引可以提高查询、排序、以及分组速度。

1、 索引分类:betree索引、hash索引。

(1)Betree索引:一个树形结构索引,页节点记录指向数据的信息,快速定位数据。

(2)Hash索引:运行在内存中,只能在memory表中使用。在磁盘中给一个空间,通过复杂运算获取磁盘的地址,当获取数据时再利用函数运算,直接获取地址拿到数据,直接命中查询速度快。

Hash索引缺点缺点:

1)可能会存在地址冲突:采用拉链算法解决。

2)随机地址,磁盘空洞。

3)范围查询无法优化。因为地址是随机的,所以无法范围优化。

4)无法运用前缀索引(利用到建立索引字段的一部分),排序无法优化。因为需要回行拿数据。

2、索引类型:独立索引、联合索引

(1)联合索引是多个列联合起来加上同一索引,列顺序区分,即满足“左前缀”要求,从左到右依次满足,若中间有断裂,则后边的不能利用。

3、索引创建:

(1)普通索引

这是最基本的索引,它没有任何限制。

创建索引:

CREATE INDEX indexName ON mytable(username(length));如果是CHAR VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

删除索引:

DROP INDEX [indexName] ON mytable;

(2)唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

创建索引:

CREATE UNIQUE INDEX indexName ON mytable(username(length));

(3)主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID) );

3、betree索引分类:根据引擎不同分为聚簇索引和非聚簇索引

(1)非聚簇索引(myisam引擎 ):索引树和数据分开,只在叶节点下放索引值以及指向行数据的引用。

(2)聚簇索引(innodb引擎):聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。既存储索引值又存储行数据(数据放在主键索引下,若无主键索引则放在非空索引下,若无非空索引则直接在内部创建一个row存放行数据),不用回行获取数据。该索引次级索引指向对主键索引的引用。

聚簇索引好处:不用回行,快速获取数据;缺点:若数据不规则则会造成页分裂(数据大,主键索引不规则)。

4、索引覆盖:如果索引中已经包含所查询的字段,则不用回行,直接从索引值获取数据,称为索引覆盖。若索引中字段不完全包含所查询的字段,则要回行。

5、索引建立原则:命中频繁、区分度高、长度小、尽量覆盖常用查询字段。

一般在实际工作中,可以根据调研,及运行日志,统计数据,进行索引建立。

7.对于左前缀区分度不高的字段(比如地址https://www.cnblogs.com,中的:“https://www.”):采用倒序、伪哈希等方法。

伪哈希:新增一个字段,利用crc32算法(哈希算法)将,需要建立索引的字段算成一个整数,然后给整数加索引,然后查询的时候给需要查询的数据先采用crc32计算,然后查询crc32字段的数据。

8.索引与排序:需要排序的字段尽量与索引一致,索引本来是有序的,而且在所索引上排序速度加快。

9.重复索引与冗余索引:

(1)重复索引:两个索引完全相同:无意义。

(2)冗余索引:两个索引有交叉的地方。

三、SQL语句优化

1、sql语句花费时间:等待时间与执行时间(查找、取出、传输少)。

(1)按数据拆分成多次查询,比如分页查询。

(2)按索引查、排序、分组,数据最好可以走索引覆盖。

(3)对不要求绝对精准的数据,可不精确查询,

(4)传输:避免在数据查询中使用select * 查询,需要哪些字段,就查那些字段。

2、sql语句性能判别:采用Explain对sql语句进行解释:

Id:

Select_type:

Table:

Type: all  、index、range、ref(引用)、const(常量)、system、null

Ref(引用):

Extra:

四、limit优化;

1、业务解决:翻页页数限制

2、技术解决:先沿着索引,获得符合条件的id,然后根据id查询。

原文地址:https://www.cnblogs.com/zslin/p/8318905.html

时间: 2024-10-10 08:13:16

Mysql优化策略的相关文章

mysql 优化策略

from:https://dbaplus.cn/news-155-1531-1.html MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. MySQL逻辑架构整体分为三层,最上层为客户端层,并非MySQL所独有,诸如:连接处理.授权认证.安全等功能均在这一层处理. MySQL大多数核心服务均在中间这一层,包括查询解析.分析.优化.缓存.内置函数(比如:时间.数学.加密等函数).所有的跨存储引擎的

千万级别数据量mysql优化策略(一)

表结构优化 1.  使用独立表空间 独立表空间指的是innodb表的一种数据结构 独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件. 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中. 2.  分区表 分区表是一种粗粒度,简易的索引策略,适用于大数据的过滤场景.最适合的场景是,没有合适的索引时,对其中几个分区表进行全表扫描.或者只有一个分区表和索引是热点,而且这个分区和索引能够全部存

mysql 优化策略(如何利用好索引)

命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfault.com/q/1010000003984016/a-1020000003984281 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c

MySQL存储引擎,索引及基本优化策略

存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有所不同,我们根据需要进行选择,比如包含ETL操作的OLTP(联机交易处理)项目中我们通常选择InnoDB,而对于读操作较多几乎没有写操作的OLAP(联机分析处理)则选MyISAM的更多.因此并不是大家都用环境相似,同一版本的MySQL,能够使用的特性就是一致的.在MySQL终端中查看支持的存储引擎,

MySQL优化—工欲善其事,必先利其器之EXPLAIN

转自:http://www.cnblogs.com/magialmoon/archive/2013/11/23/3439042.html mysql官方手册关于explain命名的说明文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type 最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下

MySQL优化---DBA对MySQL优化的一些总结

MySQL优化---DBA对MySQL优化的一些总结 http://blog.163.com/li_hx/blog/static/183991413201572522214601/ 1. 要确保有足够的内存数据库能够高效的运行,最关建的因素需要内存足更大了,能缓存住数据,更新也可以在内存先完成.但不同的业务对内存需要强度不一样,一推荐内存要占到数据的15-25%的比例,特别的热的数据,内存基本要达到数据库的80%大小. 2. 需要更多更快的CPUMySQL 5.6可以利用到64个核,而MySQL

单表60亿记录等大数据场景的MySQL优化和运维之道

此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计. 前言 MySQL数据库大家应该都很熟悉,而且随着前几年的阿里的去IOE,MySQL逐渐引起更多人的重视. MySQL历史 1979年,Monty Widenius写了最初的版本,

MYSQL备份与恢复策略与教程

数据备份属于数据容灾保护中的内容,所有的数据备份系统设计都基于这五个元素,备份源.备份目标.传输网络.备份引擎和备份策略.用户按照需要制定备份策略,使用定时任务执行备份脚本,使用备份引擎将需要备份的的数据从备份源通过传输网络传送到备份目标. 备份五元组: 1.备份源 需要备份的数据统一称为备份源,可以是文本数据,音视频数据,也可以是数据库数据等等. 2.备份目标 存放备份数据的位置,通常建议将备份数据存放在异机,或者是更远的数据中心,备份目标可以是在线的磁盘,磁盘阵列柜,也可以是磁带库或是虚拟带

我必须得告诉大家的MySQL优化原理

---恢复内容开始--- 说起MySQL的查询优化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展