摘《mysql5.5从0开始》3

  • 16性能优化
  • 16.1 优化简介
    MySQL优化原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。
    SHOW STATUS LIKE 'value';语句查看数据库性能参数
    value参数常用值:
  • Connections: 连接MySQL服务器的次数。
  • Uptime: MySQL服务器的上线时间。
  • Slow_queries: 慢查询的次数。
  • Com_select:查询操作的次数。
  • Com_insert: 插入操作的次数。
  • Com_update: 更新操作的次数。
  • Com_delete: 删除操作的次数。
摘《mysql5.5从0开始》3_第1张图片
实例查询
  • 16.2 优化查询
  • 16.2.1 分析查询语句
    查询是数据库中最频繁的操作,提高查询速度可以有效地提高MySQL数据库的性能。
    分析查询语句:EXPLAIN / DESCRIBE
    EXPLAIN语法:
    EXPLAIN [EXTENDED] SELECT select_options
    使用extended关键字,explain语句将产生附加信息。
摘《mysql5.5从0开始》3_第2张图片
explain实例
  • id:select识别符。这是select的查询序列号。

  • select_type: 表示select语句的类型,
    取值:SIMPLE表示简单查询,其中不包括连接查询;
    PRIMARY表示主查询,或则是最外层的查询语句;
    UNION 连接查询的第2个或者后面的查询语句;
    DEPENDENT UNION,连接查询中第2个或后面的select语句,取决于外面的查询;
    UNION RESULT ,连接查询的结果;
    SUBQUERY,子查询的第一个select语句;
    DEPENDENT SUBQUERY,子查询中的第一个select,取决于外面的查询;
    DERIVED,导出表的select(from子句的子查询)。

  • table:表示查询的表。

  • type:表示表的连接类型:
    (1)system:该表是仅有一行的系统表。这是const连接类型的一个特例。
    (2)const:


    const说明

    const实例

    (3)eq_ref:


    eq_ref使用说明

    摘《mysql5.5从0开始》3_第3张图片
    eq_ref实例

    。。。。。。
    。。。。。。
    DESCRIBE/DESC SELECT select_options语句与explain语句结果分析一样。
  • 16.2.2 索引对查询速度的影响
    使用索引会减少扫描表中的行数,所有加快速度。

  • 16.2.3 使用索引查询
    (1)使用like关键字的查询语句

摘《mysql5.5从0开始》3_第4张图片
实例

摘《mysql5.5从0开始》3_第5张图片
实例
like‘%’开头没使用索引

(2)使用多列索引的查询语句
MySQL可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中第一个字段是,索引才会被使用。


实例

摘《mysql5.5从0开始》3_第6张图片
实例

摘《mysql5.5从0开始》3_第7张图片
多列索引,索引的第一个字段被引用索引才会被使用

(3)使用or关键字的查询语句
查询语句中的查询条件中只有or关键字,且or前后的两个条件中的列都是索引时,查询中才使用索引。否则,不使用索引


实例

实例
。。
  • 16.2.4 优化子查询
    select语句嵌套要建立临时表,效率并不高,在MySQL中,使用连接(JOIN)查询来替代子查询。
    连接查询不需要MySQL在内存中建立临时表来完成查询工作。速度快。

  • 16.3 优化数据库结构

  • 16.3.1 将字段很多的表分解成多个表
    若有些字段的使用频率很低,当一个表的数据量很大时,会因为使用频率低的字段的存在而变慢。


    摘《mysql5.5从0开始》3_第8张图片
    表分解后,使用联合查询来查询详细信息
  • 16.3.2 增加中间表
    把需啊哟经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。

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


    设计数据库提示
  • 16.3.4 优化插入记录的速度
    影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。

对于MyISAM引擎的表优化:

(1)禁用索引
在插入之前禁用索引,数据插入完毕之后开启索引。
禁用索引:ALTER TABLE table_name DISABLE KEYS;
重新开启索引:ALTER TABLE table_name ENABLE KEYS;
对于空表批量导入数据,不需要进行此操作。MyISAM引擎的表是在导入数据之后才建立索引的。
(2)禁用唯一性检查
插入前禁用唯一性检查:SET UNIQUE_CHECKS=0;
插入完毕后开启唯一性检查:SET UNIQUE_CHECKS=1;
(3)使用批量插入
一条INSERT INTO插入多条记录 比 一个insert into一条数据的插入要快。
(4)使用LOAD DATA INFILE 批量导入
LOAD DATA INFILE 语句导入速度比INSERT语句快。

对于InnoDB引擎的表优化:

(1)禁用唯一性检查
插入前:set unique_checks=0;
插入后:set unique_checks=1;
(2)禁用外键检查
插入前:set foreign_key_checks=0;
插入后:set foreign_key_checks=1;
(3)禁止自动提交
插入数据之前禁止事物的自动提交:
插入前:set autocommit=0;
插入后:set autocommit=1;

  • 16.3.5 分析表、检查表和优化表
    (1)分析表
    ANALYZE TABLE语句:
    ANALYZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tbl_name[, tbl_name]...


    ANALYZE语句参数说明,在使用期间会对表加一个只读锁
摘《mysql5.5从0开始》3_第9张图片
实例
摘《mysql5.5从0开始》3_第10张图片
对实例的显示结果说明

(2)检查表
CHECK TABLE 语句来检查InnoDB和MyISAM表是否存在错误;对于MyISAM,CHECK TABLE语句还会更新关键字统计数据。而且CHECK TABLE也可以检查视图是否有错误,比如视图自定义中被引用的表已不存在。
check table 语法:
CHECK TABLE tbl_name[, tbl_name] ... [option] ...
option = {QUICK|FAST|MEDIUM|EXTENDED|CHANGED}

语法参数说明

摘《mysql5.5从0开始》3_第11张图片
option取值说明

注意:option支队MyISAM表有效,对InnoDB表无效。而且,CHECK TABLE也会在执行过程中给表加上只读锁。
(3)优化表
OPTIMIZE TABLE 语句只能优化表中的VARCHAR/BLOB/TEXT类型的字段。
语法:OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...


语法参数说明

通过OPTIMIZE TABLE 语句可以消除删除和更新造成的文件碎片。OPTIMIZE TABLE语句在执行过程中也会给表加上只读锁。
摘《mysql5.5从0开始》3_第12张图片
提示OPTIMIZE TABLE重新利用未使用的空间
  • 16.4 优化MySQL服务器
  • 16.4.1 优化服务器硬件
摘《mysql5.5从0开始》3_第13张图片
硬件优化
  • 16.4.2 优化MySQL的参数
key_buffer_size:表示索引缓冲区的大小

table_cache:表示同时打开的表的个数

摘《mysql5.5从0开始》3_第14张图片
query_cache_size:表示查询缓存区的大小

sort_buffer_size:表示排序缓存区的大小

read_buffer_size:表示每个线程连续扫描时为扫描的每个表分配的缓存区的大小

read_rnd_buffer_size:表示为每个线程保留的缓存区的大小

innodb_buffer_pool_size:表示innodb类型的表和索引的最大缓存

max_connections:表示数据库的最大连接数

摘《mysql5.5从0开始》3_第15张图片
innodb_flush_log_at_trx_commit:表示何时将缓冲区的数据写入日志文件,并且将日志文件写入磁盘

back_log:表示在MySQL暂时停止回答新请求之前的短时间内,多少个请求可以被存在堆栈中

interactive_timeout:表示服务器在关闭连接前等待行动的秒数

sort_buffer_size: 表示每个需要进行排序的线程分配的缓冲区的大小

thread_cache_size: 表示可以复用的线程的数量

wait_timeout:表示服务器在关闭一个连接时等待行动的描述

摘《mysql5.5从0开始》3_第16张图片
innodb_log_buffer_size

摘《mysql5.5从0开始》3_第17张图片
innodb_log_file_size

摘《mysql5.5从0开始》3_第18张图片
innodb_log_files_in_group
  • 16.6 专家点拨
    如何使用查询缓冲区?
    默认情况查询缓冲区的大小为0,也就是不可用。
    配置配置文件:
    [mysqld]
    query_cache_size=512M
    query_cache_type=1 (表示开启缓冲区)
    当在查询语句中包含SQL_NO_CACHE关键字时,才不会使用查询缓冲区。
    用法:SELECT SQL_NO_CACHE * FROM tbl_name; 不适用查询缓冲区
    可以使用FLUSH QUERY CACHE 语句来刷新缓冲区,清理查询缓冲区中的碎片。

你可能感兴趣的:(摘《mysql5.5从0开始》3)