Mysql调优(一)

一、执行计划: Explain 查询

下面三个重要相关的列:
Type/Key/exture

引一下比较不错的解释:

Type列:

 

 possible_key列 + key列:

 

 exture列

此字段显示一些额外的信息,但是此字段的部分值具有优化的参考意义。

(1)using where:表示查询使用了where 语句来处理结果

(2)using index:表示使用了覆盖索引。这个值重点强调了只需要使用索引就可以满足查询表的要求,不需要直接访问表数据。

(3)using join buffer:这个值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进性能

(4)using filesort:这是 order by 语句的结果。这可能是一个CPU密集型的过程。using filesort表示出现了文件内排序,表示很不好的现象,必须要优化,特别是大表,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。

(5)using temporary:mysql需要创建一张临时表来保存中间结果。 也就是说,需要先把数据放到临时表中,然后从临时表中获取需要的数据。出现这种临时表,也是必须需要优化的地方,特别是数据量大的情况。两个常见的原因是在来自不同表的列上使用了distinct,或者使用了不同的 order by 和 group by 列。

二、索引



2.1.MySQL的索引数据和实际数据都存储在磁盘,而非内存


2.2.当启动数据库服务时,才将数据库的索引文件读取(加载)到内存中去。


2.3.分块进行数据读取.(索引和数据量都非常大,内存放不下)(页的整数倍)

涉及到部分操作系统知识:

局部性原理
时间局部性:之前被访问的数据,很有可能很快被再次访问
空间局部性:数据和程序都有聚集成群的倾向,具备某些特征的数据可以放在一起
磁盘预读:内存和磁盘在进行交互的时候,有一个最基本的逻辑单位,称为页,也叫datapage,大小一般是4k或者8k,我们在进行数据读取的时候,一般读取的是页的整数倍
innodb默认页大小16k


2.4.考虑数据结构存储(格式:K-V)。


2.4.1 哈希表(memory,heap在内存中,innodb自适应哈希):

特点:哈希冲突散列(均等分在对应的数组下标下)、如果某一位置的链表过长,那么造成空间上的浪费,就需要更好的哈希算法优化(jdk1.8以后,扰动函数:让二进制高位参加运算)。
无序范围查询效率非常低,只能挨个遍历。

 

innodb引擎四大特性概要:
1.插入缓冲(insert Buffer/Change Buffer)
提升插入性能。change buffering,是insert buffer的加强,insert buffer 只针对insert有效,change buffering对insert、delete、update(delete+insert)、purge都有效。

只对于非聚集索引(非唯一)的插入和更新有效。对于每一次的插入,不是写到索引页中。而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入;若不在,则先放到insert buffer,再按照一定的频率进行合并操作,在写回disk。这样通常能将多个插入合并到一个操作中。目的还是为了减少随机IO带来性能损耗。

使用插入缓冲的条件:
* 非聚集索引
* 非唯一索引


2.二次写(double write)
Doublewrite缓存是位于系统表空间的存储区,用来缓存innodb的数据页,从innodb buffer pool中, Flush之后,并写入到数据文件之前,所以当操作系统或者数据库进程在数据页写磁盘的过程中崩溃。innodb也可以在doublewrite的缓存中找到数据页的备份儿,用来执行crash恢复。数据页写入到doublewrite缓存的动作所需要的IO消耗要小于写入到数据文件的消耗。因此写入操作会以一次大的连续块的方式写入。

3.自适应哈希(ahi)
条件比较苛刻。一,所索引是否被访问了17次。二、索引中的某个页已经被访问了100次。三、访问模式必须是一样的。

4.预读(read-ahead)
InnoDB使用两种预读算法来提高I/O性能:线性预读(linear read-ahead)和随机预读(randomread-ahead)

这里只是部分介绍:具体推荐去看这篇博主。

2.4.2 B+树:

推荐跳过去看,为什么MySQL的索引使用B+树,在此处不加赘述。

带着几个问题去看吧:为什么使用B+树?解决了什么问题?B+树与B-树的区别,相对于存储数据,B+树的结构优化了哪些?对查询等操作效率的影响?数据在磁盘的存取过程中,数据缺失问题减少的原因是否与B+树的链表有关?


5.IO层面减少io次数,减少io量
6.数据迁移关掉索引 尽量自增

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值