8月24-25日上课内容 第三章 MySQL索引、事务与存储引擎

news2024/11/26 8:55:06

本章结构

索引介绍

1、索引的概念

索引就是一种帮助系统能够快速查询信息的结构

2、索引的作用

设置索引之后查询速度变快,当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度

加快表与表之间连接

降低数据库的IO成本

创建唯一索引来保证数据的唯一性

减少分组和排序时间

3、索引的副作用

索引需要占用额外空间

插入和修改数据时会话费更多的时间

索引随着数据变动而变动

4、创建索引的规则

MySQL的优化        哪些字段/场景适合创建索引        哪些部署会

1、小字符

2、唯一性强的字段

3、更新不频繁,但是查询表(比重)比较高的字段

4、表记录超过 300+行

5、主键、外键、唯一键

5、索引的分类

5.1创建方式三种

1)创建所有并且指向索引的字段

2)修改表的字段来添加索引

3)创建表直接创建索引

5.2 索引的分类方式

① 普通索引:针对所有字段,没有特殊的需求和规则

② 唯一索引:针对唯一字段,仅允许出现一次空置

③ 组合索引:多列/多字段组合形式的索引 按照排序的顺序   否则无效

④ 主键索引:针对唯一字段,且不可为空,同时一张表只允许包含一个主键索引。

⑤ 全文索引:varchar  char  text    blob  clob   检索内部信息来做字段的索引

索引的概念

数据库索引
        是一个排序的列表,存储着索引值和这个值所对应的物理地址

        无须对整个表进行扫描,通过物理地址就可以找到所需数据

        是表中一列或者若千列值排序的方法

        需要额外的磁盘空间

概括:索引就是一种能够帮助系统能够快速查询信息的结构

索引的作用

索引的作用 

数据库利用各种快速定位技术,能够大大加快查询速率

当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度

可以降低数据库的IO成本,并且还可以降低数据库的排序成本

通过创建唯一性索引保证数据表数据的唯一性

可以加快表与表之间的连接

在使用分组和排序时,可大大减少分组和排序时间

索引的副作用

 索引的副作用

索引需要占用额外的磁盘空间
        对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而innoDB引擎的表数据文件本身就是索引文件当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度

在插入和修改数据时要花费更多的时间,因为索引也要随之变动

创建索引的规则

创建索引的原则依据

表的主键、外键必须有索引

记录数超过300行的表应该有索引

经常与其他表进行连接的表,在连接字段上应该建立索引

唯一性太差的字段不适合建立索引

更新太频繁地字段不适合创建索引

依据2

经常出现在where子句中的字段,特别是大表的字段
应该建立索引
索引应该建在选择性高的字段上
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

小结:

MySQL的优化        哪些字段/场景适合创建索引        哪些部署会

1、小字符

2、唯一性强的字段

3、更新不频繁,但是查询表(比重)比较高的字段

4、表记录超过 300+行

5、主键、外键、唯一键

索引的分类

 

 

5.1创建方式三种

1)创建所有并且指向索引的字段

2)修改表的字段来添加索引

3)创建表直接创建索引

创建索引:

1、创建索引的时候,直接指定 index 

2、alter 修改表的结构的时候,添加add  添加index

3、直接创建表的时候添加索引

PS:主键索引-------->直接创建主键即可

5.2 索引的分类方式

① 普通索引:针对所有字段,没有特殊的需求和规则

② 唯一索引:针对唯一字段,仅允许出现一次空值

③ 组合索引:多列/多字段组合形式的索引 按照排序的顺序   否则无效

④ 主键索引:针对唯一字段,且不可为空,同时一张表只允许包含一个主键索引。

⑤ 全文索引:varchar  char  text    blob  clob   检索内部信息来做字段的索引

查看索引的方式

show index from 表名

show keys from 表名

删除索引的方式

直接删除索引

drop index 索引名 on 表名

修改表的方式删除索引

alter table 表名 drop index 索引名

删除主键索引

alter table 表名  drop primary key;

小结

重点小结:

索引:加速——》便于客户端获取数据(提升用户体验感)+ 减少mysql 服务器的压力
索引就是一种MySQL的优化(从两个方向考虑,1、哪些字段/场景适合创建索引2、哪些字段/场景不适合)

索引类型:
① 普通索引
② 唯一索引
③ 主键索引
④ 组合索引
⑤ 全文索引 

事务

1、事务的概念

2、事务的ACID特点

3、事务隔离性的几个问题/事务之间的影响

4、事务的控制语句

事务的概念

        是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
        是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元        

        适用于多用户同时操作的数据库系统的场景,如银行保险公司及证券交易系统等等

        通过事务的整体性以保证数据的一致性

事务的ACID特点

原子性(Atomicity)
事务是一个完整的操作,事务的各元素是不可分的

事务中的所有元素必须作为一个整体提交或回滚

如果事务中的任何元素失败,则整个事务将失败

一致性(Consistency)
当事务完成时,数据必须处于一致状态

在事务开始前,数据库中存储的数据处于一致状态

在正在进行的事务中,数据可能处于不一致的状态

当事务成功完成时,数据必须再次回到已知的一致状态

隔离性 (lsolation)
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性 (Durability)
指不管系统是否发生故障,事务处理的结果都是永久的

一旦事务被提交,事务的效果会被永久地保留在数据库中

事务隔离性的几个问题/事务之间的影响

面试题:
问题
1、事务是什么? ACID是啥?有什么特性?
2、事务中请举个列子---》故障状态---》数据不一致----》导致有哪些后果,这些后果怎么解决?


一个事务的执行不能被其他事务干扰
事务之间的相互影响分为几种,分别为

脏读 

①、脏读(读取未提交数据):脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读

案列1
比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。 也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

不可重复读

②、不可重复读(前后多次读取,数据内容不一致):一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

案列
事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。
select * from member;
1 zhangsan  20分
select * from Member;
1 zhangsan  30分

幻读

③、幻读(前后多次读取,数据总量不一致):一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。


案列
假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读
select * from member;
查询到了6条记录

alter table member change

select * from member;
查询到了10条记录 (更新了6条数据,还有4条数据,我没有更新到)

丢失更新

④、丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
案列
A  30 ->40 事务 先完成
B  30 ->50 事务 后完成
B的事务结果会覆盖A的事务结果,最终值为50

mysql及事务隔离级别(四种)


(1)read uncommitted( : 读取尚未提交的数据 :不解决脏读
允许脏读,其他事务只要修改了数未提交读)据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数居。

安全性最差        但是性能最好        (不使用)

(2)read committed(提交读):读取已经提交的数据 :可以解决脏读
只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别〈不重复读)。

安全性较差        但是性能较好

(3)repeatable read(可重复度):重读读取:可以解决脏读 和 不可重复读 —mysql默认的
可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响

安全性较高        性能较差

(4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

安全性最高        性能最差        (不使用)


mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。


//事务隔离级别的作用范围分为两种:

全局级:对所有的会话有效
会话级:只对当前的会话有效


1、查询全局事务隔离级别
show global variables like '%isolation%';
SELECT @@global.tx_isolation;

2、查询会话事务隔离级别
show session variables like '%isolation%';
SELECT @@session.tx_isolation; 
SELECT @@tx_isolation;

3、设置全局事务隔离级别
set global transaction isolation level read committed;

4、设置会话事务隔离级别
set session transaction isolation level read committed;

1、查询全局事务隔离级别

show global variables like '%isolation%';

SELECT @@global.tx_isolation;

3、设置全局事务隔离级别
set global transaction isolation level read committed;

事务控制语句


BEGIN 或 START TRANSACTION:显式地开启一个事务。

COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

create database SCHOOL;
use SCHOOL;
create table info(  
id int(10) primary key not null,  
name varchar(40),  
money double  
);

insert into info values(1,'A',1000);  
insert into info values(2,'B',1000); 
select * from info;

1、测试提交事务
begin;
update info set money= money - 100 where name='A';
select * from info;

commit;
quit

mysql -u root -p
use SCHOOL;
select * from info;


2、测试回滚事务
begin;
update info set money= money + 100 where name='A';
select * from info;

rollback;
quit
mysql -u root -p
use SCHOOL;
select * from info;

 

 

 

3、测试多点回滚
begin;你
update info set money= money + 100 where name='A';
select * from info;
SAVEPOINT S1;
update info set money= money + 100 where name='B';
select * from info;
SAVEPOINT S2;
insert into info values(3,'C',1000);

select * from info;
ROLLBACK TO S1;
select * from info;

未提交事务,依旧是900

 回滚之后:

事务变回900

设置多个回滚点:

回到s2的状态:

4、使用 set 设置控制事务
SET AUTOCOMMIT=0;                        #禁止自动提交
SET AUTOCOMMIT=1;                        #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT';        #查看Mysql中的AUTOCOMMIT值

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit|rollback; 都是独立的事务。

use SCHOOL;
select * from info;
SET AUTOCOMMIT=0;
SHOW VARIABLES LIKE 'AUTOCOMMIT';
update info set money= money + 100 where name='B';
select * from info;
quit

mysql -u root -p
use SCHOOL;
select * from info;

存储引擎介绍

存储引擎概念介绍

        MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎

        存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
        MySQL常用的存储引擎

                MyISAM

                InnoDB

         MySQL数据库中的组件,负责执行实际的数据I/O操作

        MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

图示:

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

1、MySQL常用的存储引擎:
1、MyISAM
2、InnoDB

MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MyISAM   
MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

访问速度快,对事务完整性没有要求
MyISAM 适合查询、插入为主的应用场景

MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
.frm 文件存储表结构的定义
数据文件的扩展名为 .MYD (MYData)
索引文件的扩展名是 .MYI (MYIndex)

表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞: ————》串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
特性:数据单独写入或读取,速度过程较快且占用资源相对少

MyIsam 是表级锁定,读或写无法同时进行
好处是:分开执行时,速度快、资源占用相对较少(相对)

MyISAM介绍

MyISAM不支持事务,也不支持外键
访问速度快
对事务完整性没有要求
MyISAM在磁盘上存储成三个文件

        frm文件存储表定义

        数据文件的扩展名为MYD(MYData)

        索引文件的扩展名是MYI(MYIndex)

表级锁定形式,数据在更新时锁定整个表

数据库在读写过程中相互阻赛
        会在数据写入的过程阻塞用户数据的读取

        也会在数据读取的过程中阻塞用户的数据写入

数据单独写入或读取,速度过程较快且占用资源相对少

MyIAM支持的存储格式
        静态表
        动态表
        压缩表

MyISAM 表支持 3 种不同的存储格式⭐:
(1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
固定长度10
存储非常迅速,容器缓存,故障之后容易恢复
id(5)  char(10)
000000001

(2)动态表
动态表包含可变字段(varchar),记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。


(3)压缩表 
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景


公司业务不需要事务的支持 
单方面读取或写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差

MyIsam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

InnoDB
1、InnoDB特点
支持事务,支持4个事务隔离级别(数据不一致问题)⭐⭐
MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB
5.5 之前是myisam (isam) 默认

读写阻塞与事务隔离级别相关
能非常高效的缓存索引和数据
表与主键以簇的方式存储
支持分区、表空间,类似oracle数据库(5.5 ——》5.6 和5.7 第三代数据库8.0后版本)
支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

对硬件资源要求还是比较高的场合
行级锁定,但是全表扫描仍然会是表级锁定(select ),如
update table set a=1 where user like ‘%lic%’;

InnoDB 中不保存表的行数,如 select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表
对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引

清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表(truncate)
 

死锁⭐⭐⭐⭐


MyISAM :表级锁定
innodb :行级锁定

当两个请求分别访问/读取2行记录,同时又需要读取对方的记录数据,因为(行锁的限制)而造成了阻塞的现象

怎么解决死锁
show 

企业选择存储引擎依据
业务场景如果并发量大,什么并发量大,读写的并发量大,那我们建议使用innoDB 如果单独的写入或是插入单独的查询,那我们建议使用没有INNODB

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 

MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
 需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景

• 支持的字段和数据类型


▷所有引擎都支持通用的数据类型
▷但不是所有的引擎都支持其它的字段类型,如二进制对象

• 锁定类型:不同的存储引擎支持不同级别的锁定


▷表锁定: MyISAM 支持
▷行锁定: InnoDB 支持

这俩个面试都会问

索引的支持
•建立索引在搜索和恢复数据库中的数据时能显著提高性能
•不同的存储弓|擎提供不同的制作索引的技术
•有些存储弓|擎根本不支持索引

事务处理的支持
•提高在向表中更新和插入信息期间的可靠性
•可根据企业业务是否要支持事务选择存储引擎

查看系统支持的存储引擎

show engines;


查看表使用的存储引擎

方法一
show table status from 库名 where name='表名'\G;

例:show table status from SCHOOL where name='info'\G;

方法二
use 库名;
show create table 表名;

例:use SCHOOL;
show create table info;

修改存储引擎

方法一:通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;

例:use SCHOOL;
alter table info engine=myisam;
show create table info;

方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB

systemctl restart mysqld.service
修改完记得重启mysql服务
#注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

由于生产中数据库关系着很多服务,所以一般不建议重启。

方法三:通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;

例:mysql -u root -p
use SCHOOL;
create table hellolic (name varchar(10),age char(4)) engine=myisam;

扩展
面试题:
1、索引——》mysql 优化

在合适的字段上创建索引

在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行没有有索引的情况下扫描全表来定位某行的数据
)一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址

使用索引后,是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。

2、事务特性(ACID)
事务ACID
原子性 (一个整体,要么都执行要么都不执行)
一致性 要求事务前后数据的完整和一致
隔离性 要求多个事务之间不相互影响依赖(4个影响,4个隔离级别)
持久性 当事务提交后将永久保存,不可再回滚


3、数据不一致的情况(四种)
(1)read uncommitted(未提交读) : 读取尚未提交的数据 :不解决脏读
允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数居。

(2)read committed(提交读):读取已经提交的数据 :可以解决脏读
只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别〈不重复读)。

(3)repeatable read(可重复度):重读读取:可以解决脏读 和 不可重复读 —mysql默认的
可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响

(4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。


mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。


4、MyISAM 和 INNODB区别(差异)

- InnoDB支持事物,而MylSAM不支持事物。
- lnnoDB支持行级锁,而MylSAM支持表级锁.
- InnoDB支持MVCC,而MlSAM不支持。
- lnnoDB支持外键。而MyISAM不支持。
- lnnoDB全文索引,而MylSAM支持。

INNODB
支持事务读写并发外键5.5版本以后支持全文索引行级锁定(在用like模糊匹配全表扫描时会表级锁定)对硬件资源要求较高,特别是内存高可以提高缓存能力
三个文件存储.frm(表结构) .ibd (表数据文件同时也是索引文件) db.opt (表属性文件)适合场景有事务要求的一致性要求高的读写并发量高的
MyISAM
不支持事务外键表级锁定
读写会相互阻塞支持全文索引资源消耗较低
三个文件存储 .frm(表结构).MYI(索引文件).MYD(数据文件)三种存储格式静态表动态表压缩表
适合场景单独的读取或插入

5、你们公司用哪种存储引擎
这是高级开发者面试时经常被问的问题。实际我们在平时的开发中,经常会遇到的,在用SQLyog等工具创建表时,就有一个引擎项要你去选。如下图:

Mysql的存储引擎有这么多种,实际我们在平时用的最多的莫过于InnoDB和MyISAM了。

所有如果面试官问道mysql有哪些存储引擎,你只需要告诉这两个常用的就行。

那他们都有什么特点和区别呢?
MyISAM和InnoDB的特点:

MyISAM :默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。

InnoDB :支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。注: 在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

MyISAM和InnoDB的区别:

InnoDB支持事务,MyISAM不支持。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。
InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;5.7以后的InnoDB支持全文索引了。
InnoDB支持表、行级锁(默认),而MyISAM支持表级锁。
InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有。
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。
Innodb:frm是表定义文件,ibd是数据文件。

Myisam:frm是表定义文件,myd是数据文件,myi是索引文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【dart】dart基础学习使用(一):变量、操作符、注释和库操作

前言 学习dart语言。 注释 Dart 支持单行注释、多行注释和文档注释。 单行注释 单行注释以 // 开头。Dart 编译器将忽略从 // 到行尾之间的所有内容。 void main() {// 这是单行注释print(Welcome to my Llama farm!); }多行注释 多行注释以 /* 开始,以 / 结…

KubeFlow组件介绍

kubeflow是一个胶水项目,它把诸多对机器学习的支持,比如模型训练,超参数训练,模型部署等进行组合并已容器化的方式进行部署,提供整个流程各个系统的高可用及方便的进行扩展部署了 kubeflow的用户就可以利用它进行不同的…

合并两个有序的单链表,合并之后的链表依然有序

定义节点 class ListNode {var next: ListNode _var x: Int _def this(x: Int) {thisthis.x x}override def toString: String s"x>$x" } 定义方法 class LinkedList {var head new ListNode(0)def getHead(): ListNode this.headdef add(listNode: Li…

省级专精特新!祝贺旭帆科技荣获安徽省“专精特新”中小企业!

2023年8月,安徽旭帆信息科技有限公司(以下简称“旭帆科技”)成功荣获2023年度“安徽省专精特新中小企业”荣誉称号,成为具备专业化、精细化、特色化、新颖化的“专精特新”企业。 随着《“十四五”促进中小企业发展规划》的深入实…

mysql 查看 、设置缓冲池 buffer_pool

Mysql 存储引擎 MyIsam 和 Innodb 引擎 myIsam 存储引擎: 只缓存索引,不缓存数据,对应的键缓存参数为 key_buffer_size show variables like ‘key_buffer_size’; set global key_buffer_sizexxxx; 或者 my.ini my.cnf [server] key_buffer…

二三维电子沙盘数字沙盘虚拟现实开发教程第14课

二三维电子沙盘数字沙盘开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错。以前的版本显示倾斜数据控制不太好。 对了。目前系统暂只支持smart3d生成的kml格式的数据,由专有的录入程…

教你如何做正交表

正交表是一种用于多因素实验设计的表格。它可以帮助我们在尽可能少的试验次数下确定各个因素对结果的影响,从而提高实验效率。接下来将从以下几个方面介绍正交表的相关内容。 一、正交表基本概念 正交表是一种特制的表格,用于多因素实验设计研究。根据正…

马蹄集oj赛(第十次)

目录 2的N次幂 升级版斐波那契数列 个数统计 个数统计2 大斐列 AB problem ​编辑 A-B problem 快速幂 进行一个幂的运算 整数大小比较 2的N次幂 难度:黄金 0时间限制:1秒 巴占用内存:128M 任意给定一个正整数N(N≤100)&#xff0…

Qt6 for Windows 环境搭建(Visual Studio)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 Windows 中,如果想要开发 Qt 应用程序,可以选择多种方式: Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

线上祭奠软件:虚拟纪念与情感表达的新方式

线上祭奠软件作为一种新兴的技术应用,正在改变传统祭奠方式,为人们提供了跨越时空的虚拟纪念和情感表达方式。本文将深入探讨线上祭奠软件的意义、功能与挑战,并思考其对社会和个人的影响。 一、线上祭奠软件的意义: 1.跨…

MyBatis —— 初窥门径

前言 MyBatis作为一款优秀的持久层框架,在Java后端开发中无疑是比较重要一环,在常见的spring整合的SSM框架以及之后的SpringBoot中都可以看到MyBatis大显神威的模样。在这篇文章中,荔枝将会从Maven开启创建一个MyBatis项目并整理MyBatis相应的…

服务器放在香港好用吗?

​  相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…

函数注解学习

def hanshuzhujie(a:str,b: str m)->str:print(hanshuzhujie.__annotations__)return ab hanshuzhujie(qqq)运营结果 E:\Python\Python38\python.exe D:/pythonprojects/python-auto-test/test/hanshuzhujie.py {a: <class str>, b: <class str>, return: <…

生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能

对于许多人来说&#xff0c;可能因其涉及的期权、认购和价差在内的DeFi而显得晦涩难懂&#xff0c;但Typus Finance找到了一种通过动态NFT使体验更加丰富的方式。Typus NFT系列的Tails为用户带来一个外观逐渐演变并在平台上提升活动水平时获得新特权的角色。 Typus表示&#x…

AI时代,GPGPU和NPU哪个才是王者?

AI飞速发展&#xff0c;全球算力井喷&#xff0c;我国进入AI计算高速发展阶段&#xff0c;GPU的自主化已经摆上案头。近日&#xff0c;华夏银行首席信息官吴永飞发表研究&#xff0c;指出GPGPU是比NPU更合适的路线&#xff0c;并以海光DCU为基础进行了GPU算力池化的研究。 GPG…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

说说我最近筛简历和面试的感受。。

大家好&#xff0c;我是鱼皮。 都说现在行情不好、找工作难&#xff0c;但招人又谈何容易&#xff1f;&#xff01; 最近我们公司在招开发&#xff0c;实习社招都有。我收到的简历很多&#xff0c;但认真投递的、符合要求的却寥寥无几&#xff0c;而且都是我自己看简历、选人…

【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom

下面的例子则是利用get拦截&#xff0c;实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …

路由转发(详细理解+实例精讲)

系列文章目录 华为数通学习&#xff08;5&#xff09; 目录 华为数通学习&#xff08;5&#xff09; 前言 一&#xff0c;最长匹配原则 实例1&#xff1a; 实例2&#xff1a; 二&#xff0c;路由转发流程&#xff1a; 三&#xff0c;IP路由表小结&#xff1a; 总结 前…

公司新招了一个拿14K的测试员,而我工作3年才8K,凭什么?

最近我的好朋友给我分享了一个他公司发生的事&#xff0c;大概的内容呢就是&#xff1a;公司一位工作3年的测试员的工资还没有一个刚来的新人高&#xff0c;对此怨气不小&#xff0c;她来公司辛辛苦苦三年&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天都是按时上下班…