美文网首页
MySQL高级

MySQL高级

作者: Amy1234567 | 来源:发表于2021-11-30 16:53 被阅读0次

    一,小知识点,面试考过

    mysql设置开机自启动:chkconfig mysql on

    查看有哪些是开启自启的:ntsysv

    二,MySQL逻辑架构

    和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好的作用。主要体现在存储引擎架构上。插件式的存储引擎架构将查询处理和其他系统任务以及数据的存储提取相分离,这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

    尚硅谷

    1. 连接层:最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端、服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理,授权认证,及相关的安全方案。在该层引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层可以实现基于SSL的安全连接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

    2. 服务层:第二次架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行,所有跨存储引擎的功能也在这一层实现,如过程,函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化,如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作,如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

    3. 引擎层:存储引擎层。存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

    4. 存储层:数据存储层,主要是将数据存储在运行于裸设备的文件系统上,并完成于存储引擎的交互。

    三,存储引擎的相关命令

    查看存储所有存储引擎:show engines;

    查看存储引擎

    查看当前存储引擎:show variables like '%storage_engine%';

    查看存储引擎

    四,MyISAM和InnoDB的对比

    尚硅谷

    SQL的执行顺序:

    尚硅谷 尚硅谷

    五,索引

    1. 索引的定义:MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构

    可以得到索引的本质:索引是排好序的快速查找数据结构

    索引的目的在于提高查询频率,可以类比字典。如果要查询“Mysql”这个单词,我们需要定位到m字母,然后从上往下找到y字母,再找到剩下的sql。如果没有索引,可能需要a~z。

    2. 详解

    在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。

    示例

    一般来说索引也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。

    我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引(hash index)等。

    3. 索引的优势

    (1). 类似于图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。

    (2). 通过索引列对数据进行排序,降低了数据排序的成本,降低了CPU的消耗。

    4. 索引的劣势

    (1). 索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。

    (2). 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT, UPDATE, DELETE。因为更新表时,MySQL不仅要保存数据,还要保存下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

    (4). 索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

    5. 索引的分类

    (1). 单值索引:一个索引只包含单个列,一个表可以有多个单列索引

    (2). 唯一索引:索引列的值必须唯一,但允许有空值

    (3). 复合索引:一个索引包含多个列

    6. 基本语法

    (1). 创建

    测试

    (2). 删除

    DROP INDEX index_name ON talbe_name

    (3). 查看

    SHOW INDEX FROM table_name;

    测试

    7. 索引结构

    BTree索引,Hash索引,Full-Text全文索引,R-Tree索引

    尚硅谷 尚硅谷

    8. 哪些情况需要建索引  

    (1). 主键自动建立唯一索引

    (2). 频繁作为查询条件的字段应该创建索引

    (3). 查询中与其他表关联的字段,外键关系建立索引

    (4). 频繁更新的字段不适合创建索引 ---因为每次更新不单单是更新了记录还会更新索引,加重了IO负担

    (5). where条件里用不到的字段不创建索 引

    (6). 单键、组合索引的选择问题,在高并发下倾向创建组合索引

    (7). 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

    (8). 查询中统计或者分组字段

    9. 哪些情况不要创建索引

    (1). 表记录太少

    (2). 经常增删改的表(因为索引提高查询速度,但会降低更新表的速度。MySQL不仅要保存数据,还要保存一下索引文件)

    (3). 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列创建索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果

    尚硅谷

    六,索引优化分析

    1. MySql QueryOptimizer

    (1). Mysql中有专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供它认为最优的执行计划(它认为最优的数据检索方式,但不见得是DBA认为最优的,这部分最耗时间)

    (2). 当客户端想MySQL请求一条Query,命令解析器模块完成请求分类,区别出是select并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算等,然后分析Query中的Hint信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析,然后再得出最后的执行计划。

    2. MySQL常见的瓶颈

    (1). CPU:CPU再饱和的时候一般发生在“数据装入”或“磁盘上读取数据”的时候

    (2). IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候

    (3). 服务器硬件的性能瓶颈:top, free, iostat和vmstat来查看系统的性能状态

    3. explain(查看执行计划)

    (1). 使用EXPLAIN关键字可以优化模拟器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

    官网:MySQL :: MySQL 5.6 Reference Manual :: 8.8.1 Optimizing Queries with EXPLAIN

    (2). explain查看什么

    \bullet 表的读取顺序 --id

    \bullet 数据读取操作的操作类型 --select_type

    \bullet 哪些索引可以使用

    \bullet 哪些索引被实际使用

    \bullet 表之间的引用

    \bullet 每张表有多少行被优化器查询

    (3). 执行计划包含的信息

    jpg

    \star id

    select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。有以下三种情况

    a. id相同,执行顺序由上至下

    尚硅谷

    b. id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

    尚硅谷

    c. id相同不同,同时存在,不同的值大优先级大,相同的从上至下

    尚硅谷

    \star select_type

    \star type

    访问类型排列  

    尚硅谷

    system > const > eq_ref > ref > range > index > all

    一般来说,得保证查询至少达到range级别,最好能达到ref

    system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计

    const:表示通过索引一次就找到了,const用于比较primary key或unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量

    eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描

    ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所有它应该属于查找和扫描的混合体。

    range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。一般就是在你的where语句中出现了between, >, <, in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某个点,而结束于另一点,不用扫描全部索引。

    index:Full Index Scan, index与ALL的区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从磁盘中读的)。

    all:Full Table Scan,将遍历全表以找到匹配的行。

    测试

    \star  possible_keys

    显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

    \star  key

    实际使用的索引。如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重复。

    \star  key_len

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。

    key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

    \star  ref

    显示索引的哪一列被使用了,如果可能的话,是一个const。哪些列或常量被用于查找索引列的值.

    \star  rows

    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

    \star  extra

    包含不适合在其他列中显示但十分重要的额外信息

    \ast Using Filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。

    \ast Using Temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组group by。

    \ast Using Index:表示相应的select操作中使用了覆盖索引(Covering Index)避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

    Using Where: 表明使用了where过滤

    Using join buffer:使用了连接缓存

    impossible where:where子句的值总是false,不能用来获取任何元组

    select tables optimized away:在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再计算,执行计划生成的阶段即完成优化。

    distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值得动作。

    尚硅谷


    相关文章

      网友评论

          本文标题:MySQL高级

          本文链接:https://www.haomeiwen.com/subject/ocryaltx.html