索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型,各类索引有各自的数据结构实现。 通过目录,就可以快速的找到某个章节对应的位置。=》索引的效果,就是为了加快查找的速度。
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
show index from 表名;
表里如果有主键,主键这一列就会自动创建索引。 unique和foreign key也会自动创建索引。
create index 索引名 on 表名;
创建索引,最好的方式是在表创建之初就把索引做进去了。否则,如果是针对一个表中已经有很多很多记录来创建索引。这是一个很危险的操作。
drop index 索引名 on 表名;
SQL是通过数据库的执行引擎来执行的,此处涉及到一些“优化”操作 索引其实是不好预期的,我们可以使用explain这个关键字,显示出查询过程中具体的使用索引的情况。
索引在mysql中的数据结构是什么? 索引的主要目的是为了加快查找速度。 N叉搜索树,每个节点上有多个值,同时有多个分叉。数的高度就降低了。 其中一种典型的实现,叫做B树。
比较次数虽然没有减少,但是读写硬盘的次数减少了。 B树已经可以比二叉搜索树更适合于做数据库引擎了,但是还不够。针对这里,又引入了B+树。是对B树的进一步改进。B+树就是为了索引这个场景,量身定做的数据结构。
上述B+树,就带来了一些好处。
由于非叶子节点只存了简单id,没有存一整行,这就意味着非叶子结点占用的空间是大大降低的。有可能在内存中可以放进去缓存,更进一步降低硬盘IO。 有的表,不只是主键索引,还有别的非主键列,也有索引。(这个情况会构造另一个B+树,B+树非叶子节点里面存的都是这一列里面的key,到了叶子节点这一层,不是存之前完整的数据行,而是存主键id) 使用主键列来查询,只要查一次B+树就可以了。如果使用非主键列的索引来查询,则需要先查一遍索引列的B+树,再查一遍主键列的B+树。 B+树这个结构,只是针对MySQl的InnoDB这个数据库引擎,里面所典型使用的数据结构。 不同的数据库,不同的引擎,里面的存储数据的结构还可能存在差异。
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
(1)开启事务:start transaction; (2)执行多条SQL语句 (3)回滚或提交:rollback/commit; 说明:rollback即是全部失败,commit即是全部成功 回滚rollback:回滚就是把执行过得操作逆向恢复回去。类似于电脑上的ctrl+z 。
mysql服务器,要同时给多个客户端提供服务。此时多个客户端之间,可能会同时发起事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就可能引起一些麻烦。 如果隔离性越高,就意味着事务之间的并发程度越低,执行效率是越慢,但数据的准确性是越高的。 如果隔离性越低,就意味着事务之间的并发程度越高,执行效率是越快,但数据的准确性是越低的。 有时候根据我们的需求不同,对执行效率,准确性的要求就不同。(具体场景,具体实现) mysql给我们提供了不同档位即mysql的隔离级别(就可以控制隔离性的高低、并发程度的高低,执行效率的高低,数据准确性的高低)
举个例子: 有一天,A看到B正在写一道很难的高数题,正好A也不会,就瞄了一眼B的做题记录。在A瞄完之后,B发现自己的做题思路错了!然后把之前的做题记录修改了。A瞄到的记录实际上是错误的。这种情况,就称为**“脏读”问题(dirty data)(即读到的这个数据有问题!)**。解决脏读问题的办法,就是降低并发性,提高隔离性。具体来说,就是给B的做题过程加密。也就是B做的时候,A不要看!当达成这个约定后,B在完成这个困难的高数题之后,A再看。A看的时候,此时B觉得自己还闲的不行。就想做这个高数题的扩展部分。B在做的时候发现原题可以有更好的解法,就把答案给改了。此时A看到的答案突然又被改了。此时这个情况就叫做“不可重复读”(即一个事务中,连续两次读到的数据,结果不一致)。如何解决这个问题呢?给读这个操作,也加锁~也就是A在看B的答案的时候,B不能修改!这两个事务之间的并发程度,进一步降低了。隔离性提高了,但与此同时,运行速度又进一步变慢了。但数据的准确度又进一步提高了。B说你小子!得,你慢慢看。我不改了!我去做大学物理题!省的我在这闲着!此时 A读到的高数题内容虽然没有变,但是他发现B在这段时间写的作业量变了!这个问题,就叫做“幻读问题(即在同一个事务中,两次读到的结果集不同)”
针对以上情况,MySQL提供了四个隔离级别。
在实际开发中就可以根据当前要解决的问题的需求场景,来决定来使用哪个隔离级别。 通过mysql的配置文件来进行调整的。