3

N天爆肝数据库——MySQL(5)

 8 months ago
source link: https://blog.51cto.com/u_16193391/9193425
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

N天爆肝数据库——MySQL(5)

N天爆肝数据库——MySQL(5)_MySQL
索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统
还维护着满足特定查找算法的数据结构,这些数据结构以魔种方式引用(指向)
数据。这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
 优点:提高数据检索的效率,降低数据库的IO成本。
    通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
 缺点:索引列也是要占用空间的。
索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、
	UPDATE、DELETE时,效率降低。
N天爆肝数据库——MySQL(5)_数据结构_02
  MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包
  含以下几种:
  B+Tree索引	最常见的索引类型,大部分引擎都支持B+树索引
  Hash索引		底层数据结构是用哈希表实现的,,只有精确匹配索引列的
  			查询才有效,			不支持范围查询
  R+tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于
  			地理空间数				据类型,通常使用较少
  Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式,类
  			似于Lucene,				Solr,ES
顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较
	深,检索速度慢。
大数据量情况下,层级较深,检索速度慢
N天爆肝数据库——MySQL(5)_MySQL_03
B-Tree(多路平衡查找树)
以一颗最大度数(max-degree)为5(5阶)的b-tree为:每个结点最多存储4个
	key,	5个指针
B+Tree
以一颗最大度数(max-degree)为4(4阶)的b+tree
N天爆肝数据库——MySQL(5)_插入图片_04
B+Tree与B-Tree区别:
1.所有的数据都会出现在叶子节点
2.叶子节点形成一个单向链表
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一
个指向相邻叶子结点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访
问的性能。
哈希索引就是采用一定的hash算法,将键值换算成心得hash值,映射到对应的槽
 位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,它们就产生了hash冲突
(也称为hash碰撞),可以通过 链表来解决
Hash索引特点
Hash索引只能用于对等比较(= ),不支持范围查询(between,>,<,...)
无法利用索引完成排序操作
查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引
存储引擎支持
在MySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash的功
能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。
N天爆肝数据库——MySQL(5)_数据结构_05
为什么InnoDB存储引擎选择使用B+Tree索引结构?
1.相对于二叉树,层级更少,搜索效率高;
2.对于B+Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页
中存储	的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高
度,导致性能降低;
3.相对于Hash索引,B+Tree支持范围匹配及排序操作;
N天爆肝数据库——MySQL(5)_MySQL_06
主键索引 针对于主键创建的索引		默认自动创建,只能有一个	PRIMARY
唯一索引 避免同一个表中某数据列中的值重复	  可以有多个		UNIQUE
常规索引 快速定位特定数据		可以有多个
全文索引 全文索引查找的是文本中的关键字,而不是比较索引中的值		
	可以有多个		FULLTEXT
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引  将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
          必须有,而且只有一个
二级索引  将数据与索引分开存储,索引结构的叶子结点关联的是对应的主键
		  可以存在多个
聚集索引选取规则
如果存在主键,主键索引就是聚集索引。
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作
		为隐藏	的聚集索引。
N天爆肝数据库——MySQL(5)_插入图片_07
CREATE [UNIQUE|FULLLTEXT] INDEX index_name ON table_name(index_col_name,...);
SHOW INDEX FROM table_name;
DROP INDEX index_name ON table_name;

SQL性能分析

SQL执行频率

MySQL客户端连接成功后,通过show[session|global] status 命令可以提供
服务器状	态信息。通过以下指令,可以查看当前数据库的INSERT、UPDATE、
DELETE、SELECT的访问频次:
	SHOW GLOBAL STATUSLIKE’Com____’;

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,
默认10	秒)的所有SQL语句的日志。MySQl的慢查询日志默认没有开启,需要
在MySQL的配置	文件(/etc/my.cnf)中配置如下信息

开启MySQL慢日志查询开关
slow_query_log=1
设置,澳门日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记
	录慢查询日志
long_query_time=2
N天爆肝数据库——MySQL(5)_插入图片_08

profile详情

Show profiles能够在SQL优化时帮助我们了解时间都耗费到哪里去了。通过
		have_profiling参数,能够看到当前MySQL是否支持profile操作;
SELECT @@have_profiling;
默认profiling是关闭的,可以通过set语句在session/global级别开启
	profiling:
SET profiling=1;
执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时;

看每一条SQL的耗时基本情况
show profiles;
查看指令
show profile for query query_id;
查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

explain执行计划

EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句信息,包括在SELECT语句
执行过程中表如何连接和连接的顺序。

N天爆肝数据库——MySQL(5)_MySQL_09

查找在select语句之前加上关键字explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
 EXPLAIN执行计划各字段含义:
id 		select查询的序列号,标识查询中执行select子句或者是操作表的顺
	序,执行顺序从上到下;(id不同,值越大,越先执行)
select_type		表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使
用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的
第二个或者后面的查询语句)、SUBQUERY(SELECT\WHERE之后包含了子查询)等
type	表示连接类型,性能由好到差类型为NULL, system, const, 
eq_ref, ref, range, index, all
Possible_key	显示可能应用在这张表上的索引,一个或多个.

EXPLAIN执行计划各字段含义:

Key		实际使用的索引,如果为NULL,则没有使用索引。
Key_len	表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,			在不损失精确性的前提下,长度越短越好。
rows	MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,			可能并不总是准确的。
Filtered	表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK