1.启动
service mysqld start
2.停止
service mysqld start
1.连接层
最上层为连接层,是一些客户端和连接服务,包含本地sock通信和大多数基于/服务端工具实现的类似TCP/IP的通信。主要完成一些类似于链接处理,授权认证,以及相关的安全方案。在该层引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2.服务层
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函效等,在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等, 最后生成相应的执行操作,如果是select语句, 服务器还会查询内部的缓存,如果缓存空间足多大, 这样在解决大量读操作的环境中能够很好的提升系统的性能。
3.引擎层
存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍 MyISAM和 InnoDB。
4.存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
1.查看存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)
2.查看MySQL的默认存储引擎
mysql> show variables like "%storage_engine%";
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.01 sec)
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作行有影响 | 行锁,操作时只锁某一行,不对其它个表,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响,空间换时间 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
b+tree和btree区别
请参考:https://blog.csdn.net/weixin_41948075/article/details/100180136
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以简单理解为“排好序的快速查找数据结构”。InnoDB使用的是B+Tree。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上
我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引等。
优势
劣势
4. 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
5. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、 UPDATE和 DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
6. 索引只是提高效率的一个因素,如果你的MγSQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询
主要分为:单值索引,唯一索引,复合索引。
1) 单值索引 :即一个索引只包含单个列,一个表可以有多个单值索引
2) 唯一索引 :索引列的值必须唯一,但允许有空值null
3) 复合索引 :即一个索引包含多个列
1.创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name(index_col_name,...);
或者
ALTER mytable ADD 【UNIQUE】 INDEX 【indexName】 ON(columnname(length))
mysql> create index empno on EMP(EMPNO);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
2.查看索引
show index from table_name;
3.删除索引
DROP INDEX index_name ON tbl_name
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同, 也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4种索引:
BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。 (重点)
HASH 索引:只有Memory引擎支持 , 使用场景简单 。
R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常 使用较少,不做特别介绍。
Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从 Mysql5.6版本开始支持全文索引。
1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中与其它表关联的字段,外键关系建立索引
4.频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
5.where条件里用不到的字段不创建索引
6.单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
7.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
8.查询中统计或者分組字段
不适合索引的情况:
1.表记录太少
2.经常增删改的表,因为提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、 UPDATE和 DELETE。在更新表时, MySQL不仅要保存数据,还要保存一下索引文件。
3.数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
参考:
https://segmentfault.com/a/1190000015416513
只有sql中where包含联合索引的首个字段的查询才能命中索引,这个叫索引的最左匹配特性。一般在程序设计时,where子句中使用最频繁的一列放在最左边,。联合索引的使用在写where条件的顺序无关,mysql查询分析会进行优化而使用索引。但是减轻查询分析器的压力,最好和索引的从左到右的顺序一致。
1.MySQL query optimizer
1)MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(机器认为最优的数据检索方式,但不见得是DBA认为是最优的
这部分最耗费时间)
2)当客户端向MySQL请求一条 Query,命令解析器模块完成请求分类,区别出是 SELECT并转发给MySQL Query Optimizer时, MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对 Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析 Query中的Hnt信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query进行写相应的计算分析,然后再得出最后的执行计划。
MySQL常见瓶颈
1.CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
2.IO:磁盘IO瓶颈发生在装入数据远大于内存容量的时候
3.服务器硬件的性能瓶颈:top,free,iostat和 vmstat米查看系统的性能状态
新手常见问题
1.查询语句低效
2.索引失效(包含单值索引和复合索引)
3.关联查询太多join(设计缺陷或不得已的需求)
4.服务器调优及各个参数设置(缓冲、线程数等)
explain
使用explain关键字可以模拟优化器执行SQL查询语句,可以分析查询语句或者表结构的性能瓶颈。
mysql> explain select * from EMP;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | EMP | NULL | ALL | NULL | NULL | NULL | NULL | 14 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
上表说明:
id:select查询的序列号,表示查询中执行的select子句或操作表的顺序。标志着表的读取顺序。有三种情况:
①id相同,执行顺序由上至下;
②如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
③有的id相同,有的不同的情况时,id相同的为一组,从上外下执行,其余的必须满足id值越大,优先级越高,越先执行。
select_type:查询的类型,主要是用于区别普通查询(simple),联合查询,子查询等复杂情况。表示数据读取操作的操作类型。
table: 显示这部分的数据来自于哪张表
type: 显示访问类型排序,一般来说,得保证查询至少达到range级别,最好能够达到ref
简记为:
type说明:
system :表主要一行记录(等于系统表),这是const类型的特例
const: 表示通过索引一次就能够找到,const用于比较primary key或者unique索引,通常比如where后接某个筛选主键。
eq_ref :唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。
ref : 查找条件列使用了索引而且不为主键和unique(一个普通的key)。即,虽然使用了索引,但该索引列的值并不唯一,有重复。
这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。
其好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。
range:只检索给定范围的行,使用一个索引来选择行。相对于index的全索引扫描,它有范围限制,因此要优于index。一定是基于索引的。同时除了显而易见的between,and以及'>','<'外,in和or也是索引范围扫描。
index: Full Index Scan,index与ALL区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。index需要回表随机取数据
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
possible_keys和key
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null。
Key
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中,如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。查询中若使用了覆盖索引,则该索引仅出现在key列表中。
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的),不损失精确性的情况下,长度越短越好
ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值.sql优化中rows一般是越小越好,代表所需扫描的表记录少,而filtered是越大越好,表明扫描的无用数据少,没有过多的多余的IO消耗。
rows
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
extra
包含其他的一些重要信息
Using where 说明MySQL使用了where条件过滤数据(非索引和主键筛选条件)。通常会结合type进行进一步优化
using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
MYSQL中无法利用索引完成的排序操作称为“文件排序”。
using temporary 说明使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by和分组查询group by
using index 表示相应的 select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!
如果同时出现using where,表明索引被用来执行索引键值的查找,需要回表;
如果没有同时出现 using where,表明索引用来读取数据而非执行查找动作,不需要回表。
Using index condition 命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
这类SQL语句性能也较高,但不如Using index。
using join buffer 使用了连接缓存
MySQL复习day01:数据库简介和 DQL数据查询语言
MySQL复习day02:DQL数据查询语言续
MySQL复习day03:DQL数据查询语言完结
MySQL复习day04:DML数据操作语言和DDL数据定义语言
MySQL复习day05:TCL事务控制语言和视图
MySQL复习day06:变量,存储过程
MySQL复习day07:函数
MySQL复习day08:流程控制结构
MySQL复习day09:逻辑架构和引擎,索引详解(explain)
感谢诸君观看,如果感觉有用的话,点个赞吧!