澳门在线威尼斯官方 > 电脑数据库 > 威尼斯澳门在线数据库聚焦与非聚焦索引

原标题:威尼斯澳门在线数据库聚焦与非聚焦索引

浏览次数:175 时间:2019-09-29

1 数据库事务处理

一个数据库事务通常包含对数据库进行读或写的一个操作序列 . 当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚.

1 为数据库提供了一个从失败恢复到正常状态的方法 , 同时提供了数据库在异常状态下仍然能保持一致性方法

2 当多个应用程序并发访问数据库时,可以在这些应用程序之间提供隔离方法,以防止彼此的操作互相干扰

事务具有的特性:

原子性(Atomicity):事务作为一个整体被执行,对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

爬虫数据库操作封装

import pymysql
'''爬虫数据库存储'''
class Sql(object):
    def __init__(self):
        #创建连接
        self.conn = pymysql.connect(host='xxx', port=3306, user= 'root', passwd = 'xxx', database = 'douban',charset = 'utf8')
        #创建游标
        self.cursor = self.conn.cursor()
        #执行sql清空Movie
        self.cursor.execute("truncate table Movie")
        self.conn.commit()

    def process_item(self, item, spider):
        try:
            #执行sql插入语句
            self.cursor.execute("insert into Movie (name,movieInfo,star,quote) VALUES (%s,%s,%s,%s)",(item['name'], item['movieInfo'], item['star'], item['quote']))
            #提交数据
            self.conn.commit()

        except pymysql.Error:
            print("Error%s,%s,%s,%s" % (item['name'], item['movieInfo'], item['star'], item['quote']))
        return item

    def close_spider(self, spider):
        #关闭
        self.cursor.close()
        self.conn.close()

索引

数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段

2 数据库索引

1 索引概述

索引(Index)是帮助MySQL高效获取数据的数据结构, 数据库查询是最重要,最基本功能之一.

常见的查询算法:

>1 顺序查找 , 数据量大时,肯定不行
>
>2 二分查找, 但要求数据有序
>
>3 二叉树查找,只能应用在二叉树上
>
>4 为了适应各种复杂的数据结构, 数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引

索引方式

威尼斯澳门在线 1

2 聚焦索引与非聚焦索引

聚焦索引

目前大部分的数据库系统及文件系统都是采用B-Tree与 B+Tree实现的即平衡树的数据结构.

我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。 事实上, 一个加了主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我认知中的「表」很接近。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置 , 这样原本大量查询的数据查询次数计算 , 查找次数是以树的分叉数为底,记录总数的对数,大大降低次数数量级.

威尼斯澳门在线 2

​ 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。

非聚焦索引即常规索引

非聚焦索引即 每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。

非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,如下图

威尼斯澳门在线 3

不管以任何形式查询表,绝大部分都要通过聚焦索引来进行定位, 聚集索引(主键)是通往真实数据所在的主要路径。

非聚焦索引流程

#创建索引
create index_age name on user_info(age);
#查询年龄为20的用户名
select name from user_info where index_age = 20;

首先,通过非聚集索引index_age查找age等于20的所有记录的主键ID值

然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置

最后, 从得到的真实数据中取得naem字段的值返回, 也就是取得最终的结果

复合索引即多字段查询

#创建复合索引
create index index_birthday_and_user_name on user_info(birthday, user_name);
#查询生日为1993-11-1的用户名
select user_name from user_info where birthday = '1993-11-1'

通过非聚集索引index_birthday_and_user_name查找birthday等于1993-11-1的叶节点的内容,然而, 叶节点中除了有user_name表主键ID的值以外, user_name字段的值也在里面, 因此不需要通过主键ID值的查找数据行的真实所在, 直接取得叶节点中user_name的值返回即可。 通过这种覆盖索引直接查找的方式, 可以省略不使用覆盖索引查找的后面两个步骤, 大大的提高了查询性能

威尼斯澳门在线 4

索引的类型
创建索引的语句

创建索引

CREATE INDEX name_index
ON Employee (Employee_Name)

联合索引

CREATE INDEX name_index
ON Employee (Employee_Name, Employee_Age)
从数据结构角度分

1.B+索引:
传统意义上的索引,最常用最普遍的索引
2.hash索引:
hash索引是一种自适应的索引,数据库会根据表的使用情况自动生成hash索引,人为无法干预
3.全文索引:
用于实现关键词搜索,但它只能根据空格分词,因此不支持中文,可以使用lucene实现搜索功能
4.RTree索引:
在mysql很少使用,仅支持geometry数据类型;相对于BTREE,RTREE的优势在于范围

3 Redis原理

概述

  1. 是一个完全开源免费的key-value内存数据库
  2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets

Redis数据库

Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。在使用缓存的时候,redis比memcached具有更多的优势,并且支持更多的数据类型,把redis当作一个中间存储系统,用来处理高并发的数据库操作.

Redis存储的优点:

  • 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
  • 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
  • 自动操作:对不同数据类型的操作都是自动的,很安全
  • 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
  • Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。

Redis缺点

  • 是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

Redis的常见应用场景

一:缓存——热数据


热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存

  • Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis
  • update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据

二:计数器

诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能! redis只是存了内存,记住要持久化,命令用 INCRBY

INCR user:<id> EXPIRE  

三:队列

  • 由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以判断用户是第几个访问这种业务
  • 队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用

四:位操作(大数据处理)

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。

原理是:

redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount

五:分布式锁与单线程机制

验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis,设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交

六:最新列表

例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。用mysql查询并且初始化一个List到redis中。

七:排行榜

这个需求与上面需求的不同之处在于,取最新N个数据的操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

//将登录次数和用户统一存储在一个sorted set里
zadd login:login_times 5 1
zadd login:login_times 1 2
zadd login:login_times 2 3
//当用户登录时,对该用户的登录次数自增1
ret = r.zincrby("login:login_times", 1, uid)
//那么如何获得登录次数最多的用户呢,逆序排列取得排名前N的用户
ret = r.zrevrange("login:login_times", 0, N-1)
物理存储角度

数据库以页为存储单位,一个页有8K(8192byte),一页存放N条记录

在B+树中分为数据页和索引页
B+树的高一般为2-4层,因为查找某一键值的记录只需要2-4次I/O,效率较高

1.聚集索引(也叫聚簇索引)
2.非聚集索引
不管是聚集索引还是非聚集索引他们的结构都是B+树,他们的唯一区别是
聚集索引的数据页存放的是完整的记录,也就是说,聚集索引决定了表的物理存储顺序
非聚集索引的数据页中存放的是指向记录的地址信息,他真正的数据已经在聚集索引中存储了
 1、聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
 2、聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同,一个表只能包含一个聚集索引,聚集索引比非聚集索引有更快的访问速度
索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
术语“聚簇”表示数据行和相邻的键值紧密地存储在一起,InnoDB 的聚簇索引的数据行存放在 B-Tree 的叶子页中。
因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
优点

  1. 可以把相关数据保存在一起,减少 I/O 操作;
  2. 因为数据保存在 B-Tree 中,因此数据访问更快。
    缺点
  3. 聚簇索引最大限度提高了 I/O 密集型应用的性能,但是如果数据全部放在内存,就没必要用聚簇索引。
  4. 插入速度严重依赖于插入顺序,按主键的顺序插入是最快的。
  5. 更新操作代价很高,因为每个被更新的行都会移动到新的位置。
  6. 当插入到某个已满的页中,存储引擎会将该页分裂成两个页面来容纳该行,页分裂会导致表占用更多的磁盘空间。
  7. 如果行比较稀疏,或者由于页分裂导致数据存储不连续时,聚簇索引可能导致全表扫描速度变慢。

4 MVCC多版本并发控制

概述

全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操作会看到一个一致性的snapshot,并且可以实现非阻塞的读。MVCC允许数据具有多个版本,这个版本可以是时间戳或者是全局递增的事务ID,在同一个时间点,不同的事务看到的数据是不同的。

mysql中innodb实现

innodb会为每一行添加两个字段,分别表示该行创建的版本删除的版本,填入的是事务的版本号,这个版本号随着事务的创建不断递增。在repeated read的隔离级别(事务的隔离级别请看这篇文章)下,具体各种数据库操作的实现:select,insert,delete,update

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好.

逻辑角度

1.普通索引:索引值不唯一
2.唯一索引:唯一索引是不允许任意两行具有相同索引值的索引,当现有数据库中存在重复键值的时候,大多数数据库不允许将唯一索引和数据库表相关联,当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。
3.主键索引:数据库中经常有一列或几列的组合,其值能唯一标识表中的每一行,该列称为主键。在数据库关系图中表为主键自动创建主键索引,主键索引是唯一索引的特定类型,该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
4.空间索引

主键和唯一索引的区别:
1.一个表可以有多个唯一索引,而主键只能有一个
2.主键可以作为其它表的外键
3.主键不可以为null,而唯一索引可以为null
主键就是聚焦索引”这是极端错误的,是对聚焦索引的一种浪费。
主键并不一定是聚集索引,只是在SQL SERVER中,未明确指出的情况下,默认将主键定义为聚集,而ORACLE中则默认是非聚集

其它索引

1.联合索引:又叫复合索引,Mysql从左到右使用索引中的字段,一个查询可以只使用索引的一部分,但必须是最左侧的部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。符合最左原则
联合索引实现:每个节点含有多个关键字,排序时按照多个关键字的顺序进行排序。而这个顺序就是你创建索引时候的顺序
如果你经常要用到多个字段的多条件查询,可以考虑建立联合索引,建立了一个联合索引就相当于建立了多个索引
联合索引sql会先过滤出last_name符合条件的记录,在其基础上再过滤first_name符合条件的记录。那如果我们分别在last_name和first_name上创建两个列索引,mysql的处理方式就不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外一个利用不上了,这样效果就不如多列索引了。虽然此时有了两个单列索引,但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引。如果经常使用单独一列作为查询条件,那么应该使用单列索引。(如有两个单列索引a、b,查询的时候只用a或只用b)。
多列建索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高
2.覆盖索引:只需要通过辅助索引就可以获取查询的信心,而无需再通过聚集索引查询具体的记录信息
由于覆盖索引不包含整行的记录,因此它的大小远小于聚集索引
比较适合做一些统计操作

索引的创建

在表上创建一个简单的索引,允许使用重复的值

CREATE INDEX index_name
ON table_name (column_name)

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

创建索引还可以用alter实现
InnoDB按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键(6个字节)然后在上面进行聚集。mysql不能手动创建聚集索引。
主键索引是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引

索引的实现

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,而B+Tree的高度低(多叉树),可以减少I/O次数
InnoDB(聚簇索引)的数据文件本身就是索引文件(索引和数据存放在一个文件idb)。从上文知道,MyISAM(非聚簇索引)索引文件(MYI)和数据文件(MYD)是分离的,索引文件仅保存数据记录的地址。
mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引(普通索引、唯一索引),又叫辅助索引(secondary indexes)。

实现区别

MyISAM引擎使用B+Tree作为索引结构,叶结点的data域存放的是数据记录的地址。MyISAM的索引方式也叫做“非聚集”的。
MyISAM左图为主索引,右图为辅助索引(二级索引),两者在结构上没什么区别,都是B+树。

威尼斯澳门在线 5

image.png

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

威尼斯澳门在线 6

image.png

InnoDB左图为主索引、右图为辅助索引,辅助索引结构也是B+树
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。

这里以英文字符的ASCII码作为比较准则(排序)。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能有一个聚集索引。

SQL语句的执行顺寻

from--where--group by--having--select--order by

Mysql中查看索引

使用“执行过程”EXPLAIN,查看索引使用情况,查询的覆盖行数等
EXPLAIN SELECT * FROM user WHERE id = 10

威尼斯澳门在线 7

image.png

B树和红黑树

B树主要是保证只有少数的磁盘访问(io次数少),解决数据结构不在主存中的数据存储问题。高度低。某一个节点可以看做一个磁盘块,里面含有指向下一个磁盘块的指针。

威尼斯澳门在线 8

image.png

关键吗就是上图磁盘块中的数字

B树从最后一层开始插入,涉及到节点的分裂
一棵含n个结点的B树的高度也为O(logn),但可能比一棵红黑树的高度小许多,应为它的分支因子比较大。所以,B树可以在O(logn)时间内,实现各种如插入(insert),删除(delete)等动态集合操作。
“阶”定义为一个节点的子节点数目的最大值(非根节点关键字个数m/2向上取整-m-1个)

B+树

威尼斯澳门在线 9

image.png

威尼斯澳门在线 10

image.png

只有叶节点存数据,非叶节点都只是下层节点最大值的复写。叶子节点间多了指针,使得范围查找变得高效(如上图查找20到65)

红黑树:

威尼斯澳门在线 11

image.png

性质1. 节点是红色或黑色。
性质2. 根是黑色。
性质3. 所有叶子都是黑色(叶子是NIL节点,空节点)。
性质4. 每个红色节点的两个子节点都是黑色。
性质5. 从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。

在进行红黑树的构造的时候,为了满足第5点,则必须每次插入的节点颜色预设为红色,插入后,有可能会导致4不满足,然后进行节点调整。所以如果是构造出来的,一般来说,不会有节点全黑的红黑树
查找、插入、删除等操作的时间复杂度为O(logn), 且最多旋转三次
红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高!!!
不能有连续2个的红节点,红黑树也是二叉查找树
红黑树的平衡性:最差情况,一棵子树全是黑色,一棵子树一红一黑····,高度最多差一倍(保证黑色数量相同)
红黑树插入时,插入节点的叔叔是黑节点:也是类似于avl树中的单旋转,双旋转,并改变着色;插入节点的叔叔是红节点:直接重新着色,并再继续向上调整
红黑树某一结点,如果只有一个儿子(如左),那么该结点为黑结点且儿子为红结点,若该结点为红结点,则朝右结点(没有)方向没有黑结点,朝左结点方向有一个黑结点,导致不平衡

威尼斯澳门在线 12

image.png

删除一个黑色叶结点时需要较复杂的调整,(删除非叶结点情况,可以从叶结点找一个跟该结点替换,从而变成删除叶结点的情况)

数据库引擎

InnoDB和MyISAM区别

Oracle收购sun(sun之前收购了mySQL),发布的首个版本5.5,默认使用了InnoDB作为存储引擎,而之前的版本使用MyISAM作为默认。
MyISAM 和 InnoDB的适用场景
MyISAM适合:读多写少(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:写多读少(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。

为什么MyISAM会比Innodb 的查询速度快

INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多;
1)数据块,INNODB要缓存,MYISAM只缓存索引块,这中间还有换进换出的减少;
2)innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快
3)INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC ( Multi-Version Concurrency Control )多版本并发控制(读不加锁,读写不冲突。)
(具体看下面Mysql中InnoDB的MVCC)

两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁

1.存储结构
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义;数据文件的扩展名为.MYD (MYData);索引文件的扩展名是.MYI (MYIndex)。
InnoDB:.ibd的文件,存储与该表相关的数据、索引、表的内部数据字典(表缓存)信息;.frm表结构文件。
2.数据导出:
MyISAM只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
3.、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少,能加载更多索引。而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb占用空间较大
4.MyISAM存储空间几乎没有限制,最多可到64PB,InnoDB最多64TB
5.InnoDB支持事务(每条sql都是事务,默认配置事务自动提交)和外键,MyISAM不支持
6.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
7.MyISAM:只支持表级锁,select,update,delete,insert语句都会给表自动加锁
InnoDB:支持行级锁,但是InnoDB的行锁,只是在WHERE的主键(唯一索引)是有效的,非主键的WHERE都会锁全表的。对索引加锁,而不是对数据行加锁,只有当查询条件能使用索引的时候才会使用行级锁
两者锁读的时候共享锁、写的时候排它锁(可以一起读,不能一起写或读写)
8.全文索引(通过关键字匹配来查询)
MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(从5.6开始支持,但不支持中文索引)
9.表的具体行数
MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(
) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
10.CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除

威尼斯澳门在线 13

image.png

Mysql其它引擎

Blackhole引擎,它会丢弃所有插入的数据,不做任何保存。但会记录日志。
CSV引擎,可以将CSV文件作为MySQL表来处理,可以作为一种数据交换机制。
Memory引擎,数据存在内存中,访问速度快,重启后数据会丢失。
Merge引擎,是MyISAM的变种,由多个MyISAM表合并而来的虚拟表。

事务的四大特性

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。事务必须是使数据库从一个一致性状态变到另一个一致性状态。多个账户钱的总和不变
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。(即事务隔离级别)(转钱时,从其他用户角度看)
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

事务的一致性

1.强一致性:读操作可以立即读到提交的更新操作。
2.弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。
3.最终一致性:事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。
其他一致性变体还有:
单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。
会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

本文由澳门在线威尼斯官方发布于电脑数据库,转载请注明出处:威尼斯澳门在线数据库聚焦与非聚焦索引

关键词:

上一篇:没有了

下一篇:威尼斯澳门在线方式安装