MySQL性能优化速记http://www.bieryun.com/3064.html

总结自《MySQL 5.7从入门到精通(视频教学版)》刘增杰编著。

优化简介

MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。
在MySQL中,可以通过SHOW STATUS 语句查询一些MySQL的性能参数。如查询连接次数,可以执行如下语句:
SHOW STATUS LIKE 'Connections';
如果要查询慢查询次数,可以执行如下语句:
SHOW STATUS LIKE 'Slow_queries';
一些常用的性能参数如下:
- Connections:连接MySQL服务器的次数;
- Uptime:MySQL服务器的上线时间;
- Slow_queries:慢查询的次数;
- Com_select:查询操作的次数(select可以换insertupdatedelete,分别查询插入、更新、删除的次数)。

MySQL数据库优化可以从三方面考虑,分别是优化查询、优化数据库结构、优化MySQL数据库。

优化查询

  1. 分析查询语句。
  2. 利用索引来加快查询速度。
  3. 优化子查询。

分析查询语句

通过对查询语句的分析,可以了解查询语句的执行情况。MySQL中提供了EXPLAINDESCRIBE 来分析查询语句。
示例如下:
EXPLAIN SELECT * FROM `user` WHERE username = 'admin';
结果如图示:

几个参数说明一下:
- id:SELECT识别 符。这是SELECT的查询序列号。
- select_type:表示SELECT语句的类型。
- table:表示查询的表。
- type:表示表的连接类型。ALL表示 进行了全表扫描。这是最坏的结果。
- possible_keys:指出MySQL能使用哪个索引在该表中找到行。如果为NULL,表示没有相关索引。
- key:表示查询实际使用到的索引。
- key_len:表示MySQL选择的索引字段按字节计算的长度。
- ref:表示使用哪个列或常数与索引一起来查询记录。
- rows:显示MySQL在表中进行查询时必须检查的行数。
- Extra:表示MySQL在处理查询时的详细信息。

利用索引来加快查询速度

MySQL中提高性能的一个最有效的方式就是对数据表设计合理的索引。索引提供了高效的查询数据的方法,并且加快了查询速度。如分析查询语句中,显示的type为ALL 就是表示进行了全表扫描,没有使用索引的情况。对username 添加一个名为username_index 普通索引,再来分析查询语句,结果如图示:

可以看到,type类型变为ref,这表示从表中读取所有匹配的行,用于索引既不是UNIQUE也不是PRIMARY KEY 的情况,或者查询中使用了索引列的左子集,即索引中左边的部分列组合。

使用索引有几种特殊情况,在这些情况下,有可能使用带有索引的字段查询时,索引并没有起效,下面介绍一下这几种特殊的情况。

  1. 使用LIKE关键字的查询语句
    在使用LIKE关键字进行查询的语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置,索引才会起作用。
  2. 使用多列索引的查询语句
    MySQL可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中的第一个字段时,索引才会起作用。
  3. 使用OR关键字的查询语句
    查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引。否则,查询将不使用索引。

优化子查询

子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然可以使查询语句很灵活,但是执行效率不高。执行子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。
在MySQL中,可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快。

优化数据库结构

合理的数据库结构不仅可以使数据库占用更小的磁盘空间,而且能够使查询速度更快。数据库结构的设计,需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

将字段很多的表分解成多个表

对于字段很多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段存在而变慢。

增加中间表

对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。

增加冗余字段

设计数据库表时应尽量遵循范式理论的规约,尽可能减少冗余字段,让数据库设计看起来精致、优雅。但是,合理地加入冗余字段可以提高查询速度。

优化插入记录的速度

插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。可以分别对此进行针对性优化。

分析表、检查表和优化表

MySQL提供了分析表、检查表和优化表的语句。分析表主要是分析关键字的分布;检查表主要是检查表是否存在错误;优化表主要是消除删除或者更新造成的空间浪费。

  1. 分析表:ANALYZE TABLE 表名;
  2. 检查表:CHECK TABLE 表名;
  3. 优化表:OPTIMIZE TABLE 表名;(只能优化表中的VARCHAR、BLOB或TEXT类型的字段)

上述的这三个方法,数据库系统都会自动对表加一个只读锁。在分析表期间,只能读取表中的记录,不能更新和插入记录。在多数场景下,不需要使用优化表,即使对可变长度的行进行了大量的更新,也不需要经常运行,每周一次或每月一次即可,并且只需要对特定的表运行。

优化MySQL服务器

优化服务器硬件

服务器的硬件性能直接决定着MySQL数据库的性能。硬件的性能瓶颈,也决定了数据库的运行速度和效率。一般常用的优化服务器硬件的方法如下:
1. 配置较大的内存。
2. 配置高速磁盘系统,以减少读盘的等待时间,提高响应速度。
3. 合理分布磁盘I/O,把磁盘I/O分散在多个设备上,以减少资源竞争,提高并行操作能力。
4. 配置多处理器,MySQL是多线程的数据库,多处理器可同时执行多个线程。

优化MySQL的参数

通过优化MySQL的参数可以提高资源利用率,从而达到提高MySQL服务器性能的目的。
MySQL服务的配置参数都在my.cnf或者my.ini文件的[MySQLd]组中。其中:

  • key_buffer_size:表示索引缓冲区的大小。索引缓冲区所有的线程共享。合理的缓冲区大小可以更好处理索引。
  • table_cache:表示同时打开表的个数。
  • query_cache_size:表示查询缓冲区的大小。
  • innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。值越大,查询的速度就会越快。
  • max_connections:表示最大连接数,该值不是越大越好,过多的连接数可能会导致MySQL服务器僵死。
    ……其它略。

补充

1.索引是不是越多越好?
合理的索引可以提高查询速度,但是索引也不是越多越好。在执行插入语句前,MySQL要为新插入的记录建立索引,所以过多的索引会导致插入操作变慢。
2. 如何使用查询缓冲区?
查询缓冲区可以提高查询速度,但是只适合查询语句比较多、更新语句比较少的情况,具体方式参照优化MySQL参数。

MySQL性能优化速记相关推荐

  1. Mysql性能优化方案

    2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...

  2. mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析

    [导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...

  3. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

  4. MySQL 性能优化,优化设计及设计原则解读

    MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...

  5. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...

  6. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  7. 常见mysql性能优化方法

    mysql性能优化: 1.为查询缓存优化你的查询 2.explain你的查询 3.当只要一行数据的时候使用limit 1 4.为搜索字段建立索引 5.千万不要order by rand() 6.避免s ...

  8. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

  9. mysql性能优化的一些建议

    mysql性能优化的一些建议 1.EXPLAIN 你的 SELECT 查询 查看rows列可以让我们找到潜在的性能问题. 2.为关键字段添加索引,比如:where, order by, group b ...

最新文章

  1. Linux state 方式 安装nginx 服务
  2. “如何写好科技论文之我见”结束语-如何写好科技论文之我见(十)
  3. Linux shell脚本编程(二)
  4. No, Machine Learning is not just glorified Statistics
  5. 【电路补习笔记】10、电感式开关电源(BUCK 降压电路)
  6. mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)
  7. –is-dba_查询存储–每个DBA的下一代工具
  8. python 继承与多态
  9. 如何优雅的抢占别人的显卡?
  10. 数字化赋能全零售 国美按下战略加速键
  11. Qsys中的EPCS使用技巧
  12. 转DICOM学习笔记
  13. iOS开发细碎知识点总结二
  14. 年薪翻倍的100篇面经:如何转型AI拿到阿里等大厂的40万offer
  15. [转]俞敏洪:我和马云就差了8个字... [来自: news.mbalib.com]
  16. 日升日落,总有黎明——暖色系原木风装修
  17. 一篇文章让你从JAVA零基础入门`OOP`编程12.19
  18. 投资理财-朋友好像的故事
  19. [apidoc]Apidoc-文档生成工具
  20. linux操作系统下载gLINUX数据恢复及RAID数据恢复解决方案(组图

热门文章

  1. mysql 执行顺序 别名_sql语句的执行顺序和别名问题
  2. linux6 yum安装mysql_linux CentOS6.5 yum安装mysql 5.6
  3. addhandler php5-script php,htaccess和AddType/Addhandler
  4. web 容器 支持 php,web服务器lighttpd 对php的支持
  5. linux mysql8.0.16 下载_Linux CentOS上安装 MySQL 8.0.16
  6. python怎么后退_使python迭代器向后退?
  7. 计算机科学与技术第6次上机实验报告,计算机科学与技术第次实验报告-20210602214116.docx-原创力文档...
  8. oracle fra空间不足,ORACLE 基础解决方案1_扩大FRA区
  9. 组合逻辑和时序逻辑学习笔记
  10. JAVA springcloud ssm b2b2c多用户商城系统-docker-hystrix-dashboard-turbine(九)