MySQL原理:存储引擎、索引和事务

本文详细介绍了MySQL的存储引擎,包括MyISAM、InnoDB、Memory和Archive的特点与应用场景。接着讨论了索引的重要性,区分了普通索引、唯一索引、全文索引等类型,并给出了优化索引的策略。最后,文章探讨了事务的ACID特性,以及不同隔离级别下可能出现的问题,重点分析了InnoDB事务的实现与日志系统。
摘要由CSDN通过智能技术生成

一、存储引擎

MySQL里的存储引擎,“存储”指的是存储数据,“引擎”是发动机的核心部分,习惯上常用引擎来代指发动机,这里指数据库的核心。

简单来说,存储引擎就是数据的存储结构,由实际业务决定。

MySQL常见的四种存储引擎:

1.MyISAM

不支持事务,支持全文索引,不支持外键,B+树,表锁,对于一些在线分析处理操作速度快。数据和索引分离。

文件组成由 myd  存放数据的  myi存放索引的

2.InnoDB

支持事务,不支持全文索引,支持外键,B+树,行锁,主要是面向在线事务处理方面的应用,特点是行锁设计,并支持外键。Innodb采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id,作为主键。索引当作数据的一部分存储。

3.Memory

将数据放在内存中,如果数据库重启或者宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引,varchar()默认是按照char()存储的,浪费内存。

不支持text和BLOB类型。varchar当成char类型处理。如果数据中有text和BLOB类型,数据库会把这些数字转换到磁盘上。

4.Archive

只支持INSERT和SELECT操作,一般用于日志处理,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,主要提供插入和压缩功能。

二、索引

关于MySQL索引的好处,如果把正确合理设计并且使用索引的MySQL比作是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。其多个数据表都会对经常被查询的字段添加索引

MySQL索引的概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?(一般数据库默认都会为主键生成索引)。

索引分为聚簇索引非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

MySQL索引的类型

1. 普通索引

这是最基本的索引,它没有任何限制, MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

01

–直接创建索引

 

02

CREATE INDEX index_name ON table(column(length))

 

03

–修改表结构的方式添加索引

 

04

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

 

05

–创建表的时候同时创建索引

06

CREATE TABLE `table` (

 

 

07

`id` int(11) NOT NULL AUTO_INCREMENT ,

 

08

`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

 

09

`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,

10

`time` int(10) NULL DEFAULT NULL ,

 

 

11

PRIMARY KEY (`id`),

 

12

INDEX index_name (title(length))

 

13

)

 

14

–删除索引

 

15

DROP INDEX index_name ON table

2. 唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。

01

–创建唯一索引

 

02

CREATE UNIQUE INDEX indexName ON table(column(length))

 

03

–修改表结构

 

04

ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

 

05

–创建表的时候直接指定

 

06

CREATE TABLE `table` (

 

07

`id` int(11) NOT NULL AUTO_INCREMENT ,

 

08

`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值