MySQL进阶

存储引擎

MySQL体系结构

连接层

服务层

引擎层       不同存储引擎会有不同的索引结构

存储层

存储引擎简介

存储数据,建立索引,更新和查询数据等技术的实现方式。

 查看建表语句:show create table 表名;

mysql5.5版本之后,默认的存储引擎是InnoDB

在创建表的时候指定存储引擎

 innodb引擎支持事务,行级锁,外键。myIsam是MySQL早期版本的默认存储引擎。memory引擎存储的数据在内存条中,通常用来做临时表。

存储引擎特点

 show variables like 'innodb_file_per_table';

如果这个是打开的,就代表每一张innodb表对应一个存储文件(.ibd),如果是关闭的,就代表共享一个文件。

ibd文件是一个二进制的文件,需要使用cmd进入黑窗口输入ibd2sdi 文件名.ibd可以查看表结构。 

page是innodb操作的最小单元,包括索引page和数据page。

myISAM不支持事务,不支持外键,支持表锁,不支持行级锁,访问速度快。涉及到的文件有三个: xxx.MYD存放的是数据         xxx.MYI存放的是索引                xxx.sdi存放的是表结构的信息

 .sdi存放的是json数据,可以在json.cn网站进行格式化,方便查看。

memory引擎文件只有.sdi文件,因为数据和索引都在内存中存储。访问数据速度很快。hash索引。

三者的区别:

常见的面试题:

myisam和innodb 的区别?

innodb支持行级锁,支持事务,支持外键。

myisam不支持行级锁,只支持表锁,不支持事务,不支持外键。 

存储引擎选择

根据不同的需求选择不同的存储引擎。

平时用的最多的是innidb,myisam被非关系型数据库(nosql)mongodb替代,memory被非关系型数据库redis替代

在linux上安装MySQL

1.准备一台linux远程服务器

2.下载linux版本的MySQL安装包(学习使用的是8.0.26)

 3.将下载好的安装包传到linux服务器

如果使用finalshell远程访问linux工具可以在底栏找到上传选项直接上传本地文件到linux服务器

4.创建目录,并解压

mkdir mysql

tar -xvf mysql.rpm-bundle.tar -C mysql

解压出来9个安装包.rpm格式

5.安装mysql

rpm安装包安装是按照一定顺序的,因为rpm安装包不会解决安装过程产生的依赖问题

yum install openssl-devel 在线安装这个插件,y确定安装。

6.启动MySQL服务

systemctl start mysqld

7.连接MySQL服务

mysql -uroot -p

需要输入密码,因为没有设置密码,所以去MySQL的日志中找到临时密码登录

另开一个linux远程访问连接

grep 'temporary password' /var/log/mysqld.log

可选择cat /var/log/mysqld.log或vi /var/log/mysqld.log进行查看

将临时密码复制过来,即可登录

8.修改root用户密码

alter user 'root'@'localhost' identified by '1234';

会报错,说密码太简单了

 我们重新设置一下密码校验的等级

set global validate_password.policy = 0;密码的校验等级设为0

set global validate_password.length= 0;--设置密码长度设为4

之后

再次执行

alter user 'root'@'localhost' identified by '1234';

即可成功

9.创建一个用户可以远程访问

create   user   'root'@'%'   identified  with  mysql_native_password  by  '1234';

10.给用户分配权限

grant  all  on  *.*  to  'root'@'%';

11.远程访问MySQL软件(datagrip)

datagrip:由JetBrains开发的数据库和SQL跨平台IDE(Integrated Development Environment  集成开发环境)

 如果连接不上,需要去linux查看防火墙有没有开放3306端口,或者关闭linux的防火墙。

索引(核心)

索引概述

 索引是一种MySQL高效获取数据的数据结构(有序)。

有索引会比没有索引查找数据更叫高效。

索引的优缺点

索引就像书的目录页,读者可以根据目录快速找到自己想要得到的信息,但是目录需要占用书本几页,如果作者对书本的内容进行增删改操作,目录页同时也要进行维护。

索引结构

索引是在MySQL的存储引擎层实现的,所以不同的存储引擎会有不同的索引结构。

 

 红黑树是自平衡的二叉树,可以解决顺序插入的问题。但是自身还是二叉树,如果数据量比较大,则树的层级较深,检索速度比较慢。

树的度数:一个节点的子节点个数。

B树:有5个度,每个节点有5个指针,有4个key用来存放数据。度数比key多一个。

这个网站是用来演示数据结构的动画:Data Structure Visualization (usfca.edu)

如果超每个节点超过key的数量,中间元素向上分裂。

B+树

非叶子节点存放指针,叶子节点存放数据。所有的key都会出现在叶子节点上。 叶子节点通过单向链表连接。

如果超每个节点超过key的数量,中间元素向上分裂,并保留一份在叶子节点。

B+树和B树的区别:

在MySQL中的B+ 树

 每个page是16KB。双向链表。

hash索引

 

面试题:为什么InnoDB采用,B+树索引结构?

索引分类

 

 

通过二级索引查找数据需要回表查询去聚集索引中查找数据。(查询时间会比直接主键查询慢)

 面试题:

索引语法

创建索引:create [unique] [fulltext]  index 索引名称 on 表名(列名,等);

查看索引:show index from 表名;

删除索引:drop index 索引名称 on 表名;

show index from 表名\G;可以在finalshell中格式化显示sql结果。

索引名称规范:idx_表名简写_列名简写

创建联合索引顺序是需要注意的。

SQL性能分析

1.SQL的执行频率(查看数据库中是select操作比较多还是更新操作多)

 2.慢查询日志(查看是那条sql语句执行超过指定的参数设置时间)

查询慢日志是否开启:show  variables like 'show_query_log';

 linux 中 vi 中的x和wq 都是保存退出,x:如果文件内容有修改,则修改文件修改日期。wq:没有修改文件中的内容也会修改文件日期。

tail -f 文件名   :实时监控文件的内容变化

这样可以方便看到哪条SQL超时了并进行对应的优化。

3.profile 详情

查看系统是否支持profile:select @@have_profiling;

查看是否开启profile:select @@profiling; 

开启profile:set profiling = 1;

 4.explain执行计划

索引使用

创建索引后,再次查询建立索引后的列,会发现查询速度快了很多。但是创建索引需要花费一定的时间。(建立二级索引B+树索引结构)

最左前缀法则:

主要是针对联合索引,每次查询先从联合索引的最左列开始查询,并且不跳过中间列,如果跳过某一列,索引将会部分失效(后面的索引失效)。若没有最左列开始,联合索引直接失效。

 上图展示的是索引部分失效,只按照联合索引中profession的key_len进行查询。

 这样也是走联合索引的,因为MySQL会自动进行优化,where条件后只要有联合索引的开头列,则会走联合索引。MySQL会自动改变where后查询条件的位置。(联合索引使用时,与查询语句书写的位置无关,只与在创建联合索引时,列的书写顺序有关)

范围查询:

如果age使用<或者>,失效的是status列。如果加=,status就不会失效了。

索引失效情况一:

1.索引列运算会导致索引失效。

例如在索引列上使用substring(索引列phone,10,2)函数

这个代表截取手机号码,从第10位开始截取2位数字。这种经过函数运算的索引会失效。

2.字符串类型的字段不加引号也会造成索引失效。

例如手机号用varchar类型存储数字,还有status使用varchar存储数字(0或1)。

因为存在隐式类型转换所以导致索引失效。

3.模糊查询(like)

如果是头部进行模糊匹配(%张),索引会失效;

如果尾部进行模糊匹配(张%),索引不会失效。

索引失效情况二:

用or连接的条件,如果有一列不涉及索引,那么都不会用到索引匹配。

只有两侧都使用索引,才会走索引。

注意:联合索引中不是第一个索引列,而是第二个或者第三个索引列,也相当于没有索引。

例如 profession,age,status是联合索引,按照这个顺序创建的联合索引。如果没有用到profession列,同时age又没有单独的单列索引和没有以age开头的联合索引,则age单独使用没有索引。

数据分布影响:

MySQL优化器发现走索引会比全表扫描慢,会走全表扫描。

 使用is null和is not null走不走索引是根据表中数据的分布情况,

如果索引列中数据全部不为null,使用is null 会走索引,使用is not null 会走全表扫描。

如果索引列中数据全部为null,使用is null会走全表扫描,使用is not null会走索引。

SQL提示

覆盖索引

尽量减少select *  的使用,而是指明字段名。 

 如果select 后面查询的是使用了索引,并且完全覆盖了二级索引的字段,就不需要回表查询,速度会快。

例如

联合索引profession,age,status

select id,profession,age,status from 表名 where profession = '';这个不需要回表查询,因为需要的数据全部都在二级索引中。

 面试题:

create index idx_表名_una_pas on 表名(username,password);

创建用户名和密码的联合索引。

前缀索引

主要用在大文本字段,降低索引的体积

单列索引和联合索引

 

索引设计原则

 SQL优化

insert数据优化:

大量数据的插入操作:

 查看MySQL有没有打开本地插入:select @@local_infile;

linux中的命令:wc -l 文件名  查看文件有多少行

                          head 文件名      只查看文件的前10行记录

主键优化

主键乱序插入会导致页分裂

 删除数据会导致页合并。

在满足业务需求的情况下,尽量减少主键的长度。因为二级索引中存放的数据就是 主键数据。

插入数据时,尽量选择顺序插入,选择auto_increment自增主键

尽量不要选择UUID做主键或者身份证号。因为UUID长度长,无序。

业务操作是尽量减少主键的修改。因为二级索引也要进行更改。

 

order by优化

 可以在创建索引的时候指明列的排序规则,asc升序,desc降序。

不指定就是默认升序排列。

联合索引,默认升序排列,如果orderby 位置写反了,不满足最左前缀法则,不会走index排序。

不是覆盖索引会走filesort。

show variables like 'sort_buffer_size';

group by优化

 建立了profession和age的联合索引。

limit优化

count优化

 

update优化

 update根据索引列进行更新,如果是普通列,则会造成innoDB的行级锁升级为表锁,降低并发。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 实战》是一本探讨MySQL数据库高级应用和实战技巧的书籍。MySQL是一种广泛使用的开源关系型数据库管理系统,在Web开发和数据分析等领域有着重要的应用。 《MySQL 实战》将帮助读者理解MySQL的高级功能和最佳实践,一步优化数据库的性能和稳定性。本书主要内容包括: 1. 高级查询优化:介绍如何使用索引、列存储和分区技术来提高查询性能,避免慢查询和死锁等问题。 2. 数据库设计与架构:详细讲解如何设计合理的数据库模型,包括表关系、数据类型和字段命名规范,以及应对高并发和大数据量的应用场景。 3. 高可用与备份恢复:介绍如何设置主从复制、集群和故障切换,确保数据库的高可用性和数据安全。 4. 性能调优与监控:介绍如何使用工具和技术调优MySQL数据库的性能,包括查询优化、缓存设置和资源管理等方面。 5. 安全与权限管理:详细讲解如何设置数据库的用户权限、访问控制和加密保护,防止非法访问和数据泄露。 6. MySQL新特性与实践:介绍新版本MySQL的特性和改,以及如何应用到实际项目中。 《MySQL 实战》不仅适合已经具有一定MySQL基础知识的读者,也可以作为MySQL数据库开发和运维人员的参考手册。通过读此书,读者将能够更深入地了解和应用MySQL数据库,在实际项目中提高开发和管理效率,提升数据库的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值