mysql】【Python基础】mysql的索引和存储引擎区别

2020-12-02 09:57发布

9条回答
我想吃肉
2楼 · 2020-12-02 10:21


(1)B+树只有叶节点存放数据,其余节点用来索引,而B树是每个索引节点都会有Data域(索引放磁盘中,磁盘IO就会增多)

(2) B+树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。这样遍历叶子节点就能获得全部数据,这样就能获得区间访问了。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。


mysql中Myisam和InnoDB都是使用B+树

Myisam和InnoDB的区别:(https://www.jb51.net/article/157181.htm)

(1)默认存储引擎的变迁:在5.1之前使用的是Myisam,5.5之后变成了InnoDB

(2)Myisam表级锁,不支持事务和全文索引,使用大并发,重负荷生产系统上,表级锁结构性能不好,InnoDB行级锁,事务安全(ACID),支持外键,5.6.4之后支持全文索引

(3)Myisam和InnoDB性能测试,随着CPU核数的增加,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。

(4)事务支持与否,Myisam是一种非事务的引擎,使得数据库可以提供高速的存储和检索,以及全文搜索能力,适合频繁查询的操作,InnoDB是事务安全的,中间哪个环节出现问题都可以回滚,Myisam不可以

(5)构成上的区别,每个MyISAM在磁盘上存储成三个文件,.frm文件存储表定义,数据文件,其扩展名为.MYD (MYData),索引文件,其扩展名是.MYI (MYIndex),


小磊子
3楼 · 2020-12-02 10:36

引言:

  MySQL存储引擎主要分为 InnoDB 存储引擎与 MyISAM 存储引擎。都采用B+数的存储结构。

应用场景:

  InnoDB适合:(1)可靠性要求比较高,要求事务;(2)大量 insert 和 update 。

  MyISAM适合:(1)没有事务。(2)插入不频繁,大量 select 。

一、 InnoDB 存储引擎

  InnoDB 存储引擎是MySQL 的默认事物型引擎,是使用最广泛的存储引擎,采用聚簇索引

  1.支持ACID的事务,支持事务的四种隔离级别。

  2.支持行级锁(默认),也支持表级索。

  3. 主键索引采用聚簇索引(索引的数据域存储数据文件本身key+行记录),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

    4. 不保存表的总行数

二、 MyISAM 存储引擎

   MyISAM 存储引擎是MySQL最早的存储引擎之一,采用非聚簇索引,没有事物和行级锁。MyISAM对整张表加锁,读取时加共享锁,写入时加排他锁。

  1. 不支持事物。

  2. 支持表级锁,不支持行级锁。

  3.采用非聚簇索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本 一致,但是辅索引不用保证唯一性。

    4. 保存总行数,MyISAM:select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含   where条件时,两种表的操作是一样的

三、聚簇索引与非聚簇索引的区别

  1. 聚簇索引的顺序就是数据的物理存储顺序,所以一个表最多只能有一个聚簇索引。如InnoDB主索引。

  2. 非聚集索引中的逻辑顺序并不等同于表中行的物理顺序,索引是指向表中行的位置的指针。如MyISAM 主索引与辅索引。

 

四、索引的实现

  1. InnoDB 索引的实现

   InnoDB 采用B+ 树的存储结构,树的叶子节点保存了完整的数据记录,该行记录。

  InnoDB的辅助索引data域存储相应记录主键的值而不是地址。

  辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

 

图1. 主索引

图2. 辅索引

 

   2. MyISAM 索引的实现

  MyISAM 存储引采用的是 B+ 树的数据结构。

  叶节点的data域存放的是数据记录的地址。

图3. 主键索引

图4. 辅助索引

 

 五、InnoDB 与 MyISAM 索引的区别

  1. InnoDB 使用的是聚簇索引,将主键组织到一棵 B+树中,而行数据就储存在叶子节 点上,若使用"whereid=14"这样的条件查找主键,则按照 B+树的检索算法即可查找到 对应的叶节点,之后获得行数据。若对 Name 列进行条件搜索,则需要两个步骤:第一步 在辅助索引 B+树中检索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主 索引 B+树种再执行一次 B+树检索操作,最终到达叶子节点即可获取整行数据。
  2. MyISM 使用的是非聚簇索引,非聚簇索引的两棵 B+树看上去没什么不同,节点 的结构完全一致只是存储的内容不同而已,主键索引 B+树的节点存储了主键,辅助键索引 B+树存储了辅助键。表数据存储在独立的地方,这两颗 B+树的叶子节点都使用一个地址 指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通
过辅助键检索无需访问主键的索引树。
  为了更形象说明这两种索引的区别,我们假想一个表如下图存储了 4 行数据。其中 Id 作为主索引,Name 作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。


三岁奶猫
4楼 · 2020-12-02 11:34

MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。

MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm文件存放表格定义;数据文件是MYD(MYData);索引文件是MYI(MYIndex)。

InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如ike操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

核心区别

MyISAM是非事务安全型的,而InnoDB是事务安全型的。

MyISAM锁的粒度是表级,而lnnoDB支持行级锁定。

MyISAM支持全文类型索引,而lnnoDB不支持全文索引。

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。


小小收藏家
5楼 · 2020-12-02 14:48

一、 InnoDB 存储引擎

  InnoDB 存储引擎是MySQL 的默认事物型引擎,是使用最广泛的存储引擎,采用聚簇索引

  1.支持ACID的事务,支持事务的四种隔离级别。

  2.支持行级锁(默认),也支持表级索。

  3. 主键索引采用聚簇索引(索引的数据域存储数据文件本身key+行记录),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

    4. 不保存表的总行数

二、 MyISAM 存储引擎

   MyISAM 存储引擎是MySQL最早的存储引擎之一,采用非聚簇索引,没有事物和行级锁。MyISAM对整张表加锁,读取时加共享锁,写入时加排他锁。

  1. 不支持事物。

  2. 支持表级锁,不支持行级锁。

  3.采用非聚簇索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本 一致,但是辅索引不用保证唯一性。

    4. 保存总行数,MyISAM:select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含   where条件时,两种表的操作是一样的

三、聚簇索引与非聚簇索引的区别

  1. 聚簇索引的顺序就是数据的物理存储顺序,所以一个表最多只能有一个聚簇索引。如InnoDB主索引。

  2. 非聚集索引中的逻辑顺序并不等同于表中行的物理顺序,索引是指向表中行的位置的指针。如MyISAM 主索引与辅索引。

 

四、索引的实现

  1. InnoDB 索引的实现

   InnoDB 采用B+ 树的存储结构,树的叶子节点保存了完整的数据记录,该行记录。

  InnoDB的辅助索引data域存储相应记录主键的值而不是地址。

  辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。


像风没有归宿
6楼 · 2020-12-02 17:03

关键是用索引

添加适当的索引,可以简化查询,将查询转变为 排好序的快速查询数据结构

在数据库中,除了数据之外,还存在着一种数据结构,这种数据结构以某种方式引用或者叫做指向数据,这样可以在这些数据结构上实现高级查找算法,这样的数据结构就算索引,可以理解为字典的目录。

但是一般来说,索引本身也会很大,是不可能全部存储在内存中的,所以索引通常是以索引文件的方式存在磁盘上,我们平时说的索引,时指B树 BalanceTree多路平衡查找树。

索引分为 单值索引,唯一索引,复合索引,通常用的时复合索引,像建立一张表一样,用create Index 索引名 on 表名(索引列,索引列),要删除用drop ,查看用show

想要查看有没有用到索引的话,可以使用explain+sql语句,里面有10个字段,其中id字段就是看语句执行优先级的,数字越大说明优先级越高,相同的数字按照从上往下的顺序执行,type字段可以看到sql语句的优化程度,总共12个类型。System>const>eq_ref>ref>range>index>all,通常优化到ref  range就够了


小小李兆佳
7楼 · 2020-12-03 10:05

MyISAM:

  1. 不支持事务,但是每次查询都是原子的;

  2. 支持表级锁,即每次操作是对整个表加锁;

  3. 存储表的总行数;

  4. 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;

  5. 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

InnoDb:

  1. 支持ACID的事务,支持事务的四种隔离级别;

  2. 支持行级锁及外键约束:因此可以支持写并发;

  3. 不存储总行数;

  4. 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;

  5. 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。


我的网名不再改
8楼 · 2020-12-11 15:36

mysql存储引擎的索引区别,这里只说明myisam和innodb
1.myisam是非聚集索引,它的索引文件和数据文件是分离的,底层是通过hash地址指向磁盘的数据位置的,hash地址无法解决范围查找
2.innodb的索引是聚集索引,
数据文件和索引文件是同一个,数据文件就是按照B+Tree组织的一个索引结构文件,叶子节点包含了完整的数据记录,在叶子节点中包含了主键索引和完整的数据记录,各个叶子节点也是通过双向链表关联的,其他索引都是以主键索引为依据的,如果表中没有主键,mysql会自动给这个表初始化一个rowid,非主键索引的叶子节点存储的是主键值,这样做的目的就是为了保证数据的一致性和节省存储空间,查询语句根据非主键索引查询的时候首先找到非主键索引的叶子节点中的主键索引,再根据主键索引去找其下的完整数据

帅帅马
9楼 · 2020-12-13 21:58

MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。

MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm文件存放表格定义;数据文件是MYD(MYData);索引文件是MYI(MYIndex)。

InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如ike操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

核心区别

MyISAM是非事务安全型的,而InnoDB是事务安全型的。

MyISAM锁的粒度是表级,而lnnoDB支持行级锁定。

MyISAM支持全文类型索引,而lnnoDB不支持全文索引。

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。


相关问题推荐

  • 回答 5

    MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的版本:针对不同的用户,MySQL分为两种不同的版本:MySQL Community Server社区版本,免费,但是Mysql不提供...

  • mysql安装步骤mysql 2022-05-07 18:01
    回答 2

    mysql安装需要先使用yum安装mysql数据库的软件包 ;然后启动数据库服务并运行mysql_secure_installation去除安全隐患,最后登录数据库,便可完成安装

  • 回答 5

    1.查看所有数据库showdatabases;2.查看当前使用的数据库selectdatabase();3.查看数据库使用端口showvariableslike'port';4.查看数据库编码showvariableslike‘%char%’;character_set_client 为客户端编码方式; character_set_connection 为建立连接...

  • 回答 5

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(    `runoob_id` INT UNSIGNED AUTO_INCREMENT,    `runoob_title` VARCHAR(100) NOT NULL,    `runoob_author` VARCHAR(40) NOT NULL,    `submission_date` DATE,    PRI...

  • 回答 5

    在常规里面设置成utf-8

  • 回答 10

    首先是我们将鼠标移动到如下图所示的计算机的图标上,点击右键,选择管理。然后我们点击如下图界面中的服务和应用程序。接下来可以看到它下面有一个我们的目标——服务。服务的话它是按字母排列的,我们往下拉,找到Mysql服务。此时可以看到它是一个手动启动...

  • 回答 7

    有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件包尚未被创建或是它们已被从新到(Incoming)目录移出。下列信息可能会对解决问题有所帮助:下列软件包有未满足的依赖关...

  • 回答 20

    1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天。3. MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。4. MySQL Cluster CGE 高级集群版,需付费...

  • 回答 8

    mysql创建外键要求比较严格,严格到有时候你找不到到底哪里错了。1.检查你的表是不是都是INNodb类型的,只有这种类型才可以创建外键。2.检查字段名是不是有错误。3.检查字段类型,最好一样。4.比较隐蔽,检查字符集,为了迁移和使用的方便,尽量使用UTF85.上...

  • 回答 2

    1、请查看数据库的存储引擎,全文索引只支持MyISAM表。2、mysql默认对全文检索有单词的字符限制:ft_max_word_len 84,ft_min_word_len 43、MYSQL 全文索引是实现不了like  的效果,只能按单词来查询...

  • 回答 3

    这个最大4g应该是和是否是32位系统无关。

  • 回答 9

    第一种叫外连接 处在join前面的表会全部选择出来,你自己去百度下 说不清第二中就是多表连接,进行笛卡尔积运算自己那拿表去实践 你很快就会明白

  • 回答 4

    一定要卸载干净!!! 1. 在控制面板将mysql管理软件卸载掉 2. 删除两个安装文件,如果没有修改安装路径的默认路径如下1)C:\Program Files  有一个mysql安装目录 ,将整个目录删除 2)另外一个安装路径是一个隐藏文件夹下的mysql目录将隐藏的文件显示...

  • 回答 6

    事实上MySQL 能承受的数据量的多少主要和数据表的结构有关,并不是一个固定的数值。表的结构简单,则能承受的数据量相对比结构复杂时大些。据D.V.B 团队以及Cmshelp 团队做CMS 系统评测时的结果来看,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数...

  • 回答 5

    事实上MySQL 能承受的数据量的多少主要和数据表的结构有关,并不是一个固定的数值。表的结构简单,则能承受的数据量相对比结构复杂时大些。据D.V.B 团队以及Cmshelp 团队做CMS 系统评测时的结果来看,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数...

  • 回答 6

    mysql哪个版本比较稳定MySQL的选择要取决于用途的,mysql5.5或者5.7 的版本,网上资源较多mysql的版本如下:1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天。3. MySQL C...

没有解决我的问题,去提问