6-Mysql 进阶-存储引擎

  • 存储引擎
  • 索引
  • 锁机制
  • 中间件

存储引擎

Mysql 体系结构


Mysql 体系结构.png
  • 客户端连接层
    支持接口: 支持的客户端链接,列如: C,Java,PHP 等语言来链接Mysql数据库
  • 第一层: 网络连接层
    连接池: 管理,缓冲用户的连接,线程处理等需要缓存的需求
  • 第二层: 核心处理层
    管理服务和工具: 系统的管理和控制工具,列如备份恢复,复制,集群等
    SQL接口: 接受SQL命令,并返回查询结构
    查询解析器: 验证和解析SQL命令,列如过滤条件,语法结构等
    查询优化器: 在执行查询之前,使用默认的一套优化机制进行优化SQL语句
    缓存: 如果缓存当中有想查询的数据,则直接将缓存中的数据返回,没有的话在重新查询
  • 第三层: 存储引擎层
    插件式存储引擎: 管理和操作数据的一种机制,包括(存储数据,如更新,查询数据等)
  • 第四层: 系统文件层
    文件系统: 配置文件,数据文件,日志文件,错误文件,二进制文件等等的保存
    存储引擎介绍
  • MySQL数据库使用不同的机制存储表文件,包括存储方式,索引技巧,锁定水平等不同的功能,这些不同的技术已经配套的功能称之为存储引擎
  • Oracle,SqlServer等数据库只支持一种存储引擎,而Mysql针对不同的需求,配置不同的存储引擎,就会让数据库采取不同处理数据的方式和扩展功能.
  • MySQL支持的存储存储引擎有很多,常用的有三种: InnoDB,MyISAM,MEMORY
  • 特性对别
    MyISAM存储引擎: 访问块,不支持事务和外键操作
    InnoDB存储引擎: 支持事务和外键操作,支持并发控制,占用磁盘空间大(Mysql5.5版本后默认引擎)
    MEMORY存储引擎: 内存存储,速度快,不安全,适合销量快速访问的数据

    引擎对比图

存储引擎的操作

  • 查询数据库支持的存储引擎
    SHOW ENGINES;
  • 查询某个数据库中所有数据表的存储引擎
    SHOW TABLE STATUS FROM 数据库名称;
  • 查询某个数据库中某个数据表的存储引擎
    SHOW TABLE STATUS FROM 数据库名称 WHERE NAME = '数据表名称';
  • 创建数据表,指定存储引擎
    CREATE TABLE 表名(列名 数据类型,...) ENGINE = 引擎名称 ;
  • 修改数据表的存储引擎

ALTER TABLE 表名 ENGINE = 引擎名称;

存储引擎的选择

  • Myisam
    特点: 不支持事务和外键操作,读取速度快,节约资源
    使用场景: 以查询操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高
  • InnoDB
    特点: MySQL默认的存储引擎,支持事务和外键操作
    使用场景: 对事务的完整性有较高的要求,在并发条件下要求数据的一致性,读写频繁的操作!
  • MeMory
    特点: 将所有数据保存到内存中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问
    使用场景: 通常用于更新不太频繁的小表,用来快速得到访问的结果

Mysql索引

索引介绍

  • MySQL索引: 是帮助MySQL搞高效获取数据的一种数据结构,所以,索引的本质就是数据结构
  • 在表数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引.

索引分类

  • 按照功能分类
    普通索引: 最基本的索引,没有任何限制
    唯一索引: 索引列的值必须唯一,但允许有空值,如果是组合索引,则列值组合必须唯一
    主键索引: 一种特殊的唯一索引,不允许有空值,在建表时有主键列同时创建主键索引
    联合索引: 就是将单列索引进行组合
    外键索引: 只有InnoBD引擎支持外键索引,用来保证数据的一致性,完整性和实现级联操作
    全文索引: 快速匹配全部文档的方式,InnoDB引擎5.6版本后才支持全文索引,MEMORY引擎不支持
  • 按照结构分类
    BTree索引: MySQL使用最频繁的一个索引数据结构,时InnoDB和myisam 存储引擎默认的索引类型,底层基于B+Tree数据结构
    Hash索引:MySQL中memory引擎默认支持的索引类型

索引的操作

  • 创建索引
    CREATE [ UNIQUE | FULLTEXT] INDEX 索引名称 [ USING 索引类型 ] --默认时BTree ON 表名(列名...);
  • 查询索引
    SHOE INDEX FROM 表名;
  • 添加索引
    普通索引:ALTER TABLE 表名 ADD INDEX 索引名称(列名);
    组合索引:ALTER TABLE 表名 ADD INDEX 索引名称(列名1,列名2,...);
    主键索引:ALTER TABLE 表名 ADD PRIMARY KEY 索引名称(列名);
    外键索引:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名);
    唯一索引:ALTER TABLE 表名 ADD UNIQUE 索引名称(列名);
    全文索引:ALTER TABLE 表名 ADD FULLTEXT 索引名称(列名);
  • 删除索引
    DROP INDEX 索引名称 ON 表名;

索引的原理

  • 索引是在存储引起中实现的,不同的存储引擎所支持的索引也不一样,这里我们主要介绍InnoDB引擎的BTree索引
  • BTree 索引类型是基于B+Tree数据结构的,而B+Tree数据结构又是BTree 数据结构的变种,通常使用在数据库和操作文件中的文件系统,特点是能够保持数据稳定有序.
  • 需要理解
    磁盘存储
    BTree
    B+Tree

索引的原理-磁盘存储

  • 系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的
  • 位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么读取什么
  • InnoDB 存储引擎中有(Page)的概念,页是磁盘管理的最小单位,在InnoDB存储引擎中默认每个小页的大小为16KB
  • InnoDB 引擎将若干个地址连接磁盘块,以此来到达也的大小16KB,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率

索引的原理-BTree


BTree原理
  • BTree数据结构
    每个节点中不仅包含key值,还有数据,会增加查询数据时磁盘的IO次数
    注意: BTree的特点时,只要查询的数据涉及到的磁盘块,磁盘块里的所有数据都会加载出来,增加了IO压力

索引的原理-B+Tree


B+Tree原理
  • B+Tree数据结构
    非叶子节点只存储key值
    所有数据存储在叶子节点
    所有叶子节点之间都有连接指针
  • B+Tree 优点
    提高查询速度
    减少磁盘的IO次数
    树形结构较小

索引设计原则

  • 创建索引遵循的原则
    1.对查询频次较高,且数据比较大的表建立索引
    2.使用唯一索引,区分度越高,使用索引的效率越高
    3.索引字段的选择,最佳候选列应从where 子句的条件中提取
    4.索引虽然可以有效的提高查询数据库的效率,但并不是越多越好
  • 最左匹配原则(使用组合索引)
    1.例如:为user表中的name, address, phone列添加组合索引
    ALTER TABLE user ADD INDEX idx_three(name,address,phone);
    2.此时,组合索引idx_three实际建立了(name)、(name,address),(name,address,phone)三个索引
    3.下面的三个SQL语句都可以命中索引
    SELECT * FROM user WHERE address = '北京' AND phone = '12345' AND name = '张三';
    SELECT * FROM user WHERE name = '张三' AND address = '北京';
    SELECT * FROM user WHERE name = '张三";
    4.这三条SQL语句在检索时分别会使用以下索引进行数据匹配(name,address,phone)
    (name,address)
    (name)
    5.索引字段出现的顺序可以是任意的,MySQL优化器会帮我们自动的调整where条件中的顺序
    6.如果组合索引中最左边的列不在查询条件中,则不会命中索引
    SELECT * FROM user WHERE address = '北京';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容