mysql为什么采用B+树作为索引?
首先,B+树相比于B树来说非叶子节点上只有索引没有数据,数据都在叶子节点,就使其非常适合进行范围查询。因为对于Mysql这种数量级非常大的数据来说可以减少磁盘的I/O次数,同时其在叶子节点添加的有指针,可以更加快速的进行查找。平均查找时间为log(n)
为什么B树不可以呢?
因为B树的非叶子节点上面既有指针也有数据,从而导致一次搜索时装入到内存的值并不多,而海量的数据会使B树的深度也比较大,就导致每次I/O磁盘的次数并未减少,降低查询效率。此外尽管两种树结构都能有效地处理动态数据集,但是由于B+树将所有数据集中在叶子节点层,它的分裂和合并操作通常比B树更加简单和平稳
Mysql的隔离级别
- 读未提交(Read Uncommitted):
- 这是最宽松的隔离级别,在这个级别下,事务可以读取其他事务尚未提交的数据变更。这种方式可能导致脏读(Dirty Reads),即一个事务能够看到另一个事务未提交的更改。
- 脏读意味着如果一个事务回滚了它所做的更改,那么另一个事务可能已经基于这些未提交的更改做出了决策。
- 在MySQL中,默认情况下不使用此隔离级别,因为它可能导致数据不一致的问题。
- 读已提交(Read Committed):
- 在此隔离级别下,一个事务只能读取到其他事务已经提交的数据变更。这避免了脏读的问题。
- 然而,可能会出现不可重复读(Non-repeatable Reads)的情况,即在同一个事务内,两次执行相同的查询可能得到不同的结果,因为在这两次查询之间,另一个事务可能修改并提交了相关的数据。
- 可重复读(Repeatable Read):
- 这是MySQL InnoDB存储引擎的默认隔离级别。在这个级别下,事务在整个事务期间看到的数据是一致的,也就是说,在同一事务内的多次读取将返回相同的结果,即使其他事务在此期间对数据进行了修改并提交。
- 此隔离级别防止了不可重复读的问题,但是仍然可能存在幻读(Phantom Reads),即在同一事务中,同样的查询可能返回不同的行集,因为其他事务插入了新的行,并且这些行符合查询条件。
- InnoDB通过Next-Key Locks机制进一步减少了幻读的可能性,使得实际应用中很少发生真正的幻读现象。
- 串行化(Serializable):
- 这是最严格的隔离级别,它强制事务按照顺序执行,完全避免了脏读、不可重复读和幻读的问题。
- 在这种模式下,所有访问数据库的事务都会被锁定,直到前一个事务完成为止,这样就确保了事务之间的完全隔离,但同时也极大地降低了系统的并发性能。
- 适用于那些需要绝对的数据一致性而可以接受较低并发性的场景。
mysql delete limit 使用方法
后面加数字可以控制每次删除多少数据
MYSQL的索引与索引方法
MySQL索引的概念:
- 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
- 索引分为:聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;**聚簇索引:**能提高多行检索的速度,**非聚簇索引:**单行的检索很快。
- 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
MySql常见索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引
常见的索引方法有FULLTEXT,BTREE,RTEE,HASH。
一、普通索引 创建
创建普通索引,不需要添加 [UNIQUE | FULLTEXT | SPATIAL ] 等任何参数进行约束。
- 普通索引 (由关键字KEY或INDEX定义的索引) 的唯一任务是加快对数据的访问速度。
- 只为那些最经常出现在‘查询条件’(WHERE column = …) 或‘排序条件’(ORDER BY column)中的数据列,来创建索引。
- 只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个int整数类型的数据列)来创建索引。
例:创建的表名为 score 的数据表,并在该表的 id 字段上建立名称为 score_id 的 ’ 普通索引 ',index关键字创建。
二、唯一索引 创建
创建唯一索引时,使用 UNIQUE 参数对 INDEX | KEY 进行约束。
- 与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
- 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的*好处*:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。
- 事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
- 主索引:在前面已经反复多次强调过!必须为主键字段创建一个索引,这个索引就是所谓的"主索引"。
- 主索引 与 唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。
三、全文索引 创建
全文索引只能作用在 CHAR、VARCHAR、TEXT、类型的字段上。创建全文索引需要使用 FULLTEXT 参数进行约束。
- MySQL从3.23.23版开始支持全文索引和全文检索,*fulltext索引仅可用于 MyISAM 表*;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。
- 对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
- 文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
- 这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用命令添加**。**
- 有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
SELECT * FROM table_name **
** WHERE MATCH(column1, column2) AGAINST(‘word1’, ‘word2’, ‘word3’)
- 上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
四、单列索引 创建
创建单列索引,即在数据表的单个字段上创建索引。创建该类型索引不需要引入约束参数,用户在建立时只需要指定单列字段名,即可创建单列索引。
- 多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
五、多列索引 创建
创建多列索引,即在数据表的多个字段上创建索引。与上述单列索引类似,**创建该类型索引不需要引入约束参数。
- 多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
注意:在多列索引中,只有查询条件中使用了这些字段中的第一个字段(即上面示例中的 name 字段),索引才会被使用。
触发多列索引的条件是用户必须使用索引的第一字段,如果没有用到第一字段,则索引不起任何作用,用户想要优化查询速度,可以应用该类索引形式。
例:组合(复合)索引 —(‘最左前缀’原则)
针对 title 和 time 建立一个组合索引:alter table info add index index_title_time
(title
(50),time
(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:
使用到上面的索引:
SELECT * FROM article WHREE title=‘测试’ AND time=1234567890;
SELECT * FROM article WHREE title=‘测试’;
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;
六、空间索引 创建
创建空间索引,需要添加 SPATIAL 参数进行约束。
同样,必须说明的是,只有 MyISAM 类型的表支持