MySQL进阶--索引
mysq配置文件
配置文件:
/etc/my.cnf
数据库存储位置:
window下,data目录下
linux下,/var/lib/mysql
宝塔面板:/www/server/data
数据文件:
.frm 存放表结构
.myd 表数据
.myi 表索引
mysql框架
MySQL插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离
可以根据需要选择合适的存储引擎
1:连接层
最上层是一些客户端和连接服务,包含本地sock通信和类似tcp/ip通信,
主要完成连接处理、授权认证、及相关的安全方案
该层引入了线程池的概念
2:服务层:
大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行,
所有跨存储引擎的功能也在这一层实现,如过程、函数等
在该层服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化
如确定查询表的顺序、是否利于索引等
3:引擎层:
真正负责了mysql中数据的存储和提取
4:存储层
存储在文件中,完成了与存储引擎的交互
mysql索引优化分析
性能下降SQl慢、等待时间长、执行时间长
查询语句写的烂
索引失效
单值
复合
关联查询太多join(设计缺陷或不得已的需求)
服务器调优及各个参数的设置(缓冲、线程池等)
sql执行加载顺序
sql执行顺序:
select * from ... join ... on ... where ... group by ... having ... order by ... limit ...
6 1 2 3 4 5 7 8
索引
排好序的快速查找数据结构
索引会影响到where和order by两大功能
定义:索引(index)相当于数组里面的下标,是帮助mysql高效获取数据的数据结构
目的:提高查找效率,类比字典
数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,
这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引
一般来说索引本身也很大,因此索引往往以索引文件的形式存储在磁盘上。
我们平常说的索引,如果没有特别指明,都是B树(多路搜索树,并不一定是二叉树)
唯一索引默认都是B+树索引
现在是大数据时代,很多数据在service层删除,但是在最后不会真正删除,把激活改为未激活,
逻辑上删除。
1,为了数据分析
2,为了索引,数据越频繁的修改、删除、新增后,索引会慢慢失效。
优势:
提高查找效率,降低数据库的IO成本
降低数据排序的成本,降低了CPU的消耗
劣势:
索引实际上也是一张表,保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的
虽然索引大大提高了查询速度,但是却会降低表的更新速度,不仅要更新数据,还要调整因为
更新所带来的减值变化的索引信息
如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询
单值索引(比较少)
一个索引只包含单个列,一个表可以有多个单列索引
唯一索引
索引列的值必须唯一,但允许为空
复合索引
即一个索引包含多个列
基本语法
创建
create [unique] index indexName on mytable(columName(length));
alter mytable add [unique] index [indexName] on (columName(length));
删除:
drop index [indexName] on mytable;
查看:
show index from table_name
初始化介绍
创建索引的情况
1、主键字段创建索引
2、频繁作为查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系建立索引
4、频繁更新的字段不适合创建索引
5、where用不到的字段
6、高并发下倾向创建组合索引
7、查询排序的字段,排序字段若通过索引去访问将大大提高排序速度
8、查询中统计或分组字段
9、重复次数多的字段,没有必要创建索引
性能分析
Mysql Query Optimiizer(查询优化器)
通过计算分析系统中收集到的统计信息,为客户端请求的Query提供最优的执行计划
(他认为最优的数据检索方式,不见得是DBA认为最优的,这部分最耗费时间)
mysql常见瓶颈:
CPU:一般发生在数据装入内存或从磁盘上读取数据的时候
IO:装入数据远大于内存容量的时候,可以扩大缓存
硬件性能
explain
使用EXPLAIN关键字可以模拟优化器执行sql语句,从而知道mysql是如何处理你的sql语句
分析你的查询语句或是表结构的性能瓶颈
能干嘛:
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
怎么玩:
explain+sql语句
执行计划包含的信息
*******
id:(表的读取顺序)
id相同,执行顺序有上到下,
id越大,越先被执行
select_type:(数据读取操作的操作类型)
simple:简单,不包含子查询和union
primary:查询中若包含任何复杂的子查询,最外层查询则被标记为该类型
subquery:在select或where中包含的子查询
derived:from列表包含的子查询,临时表
union:第二个select出现在union之后,则被标记为union
union select:从union表获取结果的select
table:
这一行数据是关于哪张表的
********
type:(查询类型)
如果数据上百万条,有all,则需要优化,
一般来说至少优化到range、ref
从最好到最差依次如下
system:表只有一条记录,平时不会出现,忽略不计
const:通过索引一次就找到了,用于比较primary key或unique索引,只匹配一行数据
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配
ref:非唯一性索引扫描,返回匹配某个单独值的所有行
range:只检索给定范围的行,使用索引来选定行,eg:>
index:只遍历索引树,通常比all快,index是从索引中读取的,全索引扫描
All:而all是从硬盘中读取的,全表扫描
(哪些索引可以使用,哪些索引被实际使用)
possible_keys:显示可能应用在这张表中的索引,一个或多个,但比一定被查询实际使用
**************
key:
实际使用的索引
查询的字段刚好是索引,where没使用索引,此时,也会使用索引
key_len:表示索引使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失
精确性的情况下,长度越短越好。
显示的值为索引字段的最大可能长度,并非实际使用长度
ref:显示索引的那一列被使用了,如果可能的话,是一个常数。
哪些列或常量被用于查找索引列上的值
*****************
(每张表有多少行被优化器查询过)
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
******************
Extra:重要的额外信息
Using Filesort:********需要避免
说明mysql索引会对数据使用一个外部的索引排序,而不是按照表内的索引顺序
进行读取。
mysql无法利用索引完成的排=排序操作称为‘文件排序’
Using temporary:*******更要避免
使用了临时表保存中间结果,mysql在对查询结果排序时使用了临时表。
需要建立、回收表,数据一大就会性能下降。
常见于排序order by和分组查询group by;
using index:
使用了索引覆盖
索引覆盖
就是select的数据列只用从索引中就能读取到,不必读取数据行
换句话说查询列要被索引覆盖
using where:用了where,查找表
using join buffer:join太多,使用缓冲
impossible where:where总是false,错乱
select tables optimized away:在没有group by的情况下,基于索引优化min/max/count
不必等到执行阶段再进行计算,查询执行计划生成阶段即可完成优化
distinct:优化distinct操作,找到第一匹配的元祖后即停止找到同样的动作
分组之前比排序,group by要么别建索引,要么就按照索引的个数、顺序来,否则特别容易产生,文件排序
Extra:重要的额外信息