Mysql--索引,事务,锁

侵权删
Mysql是什么?
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

Mysql知识点一:索引

索引是什么?
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。
如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为什么使用索引?

  • 索引大大减少了存储引擎需要扫描的数据量(INNODB 最小一页 16k)即 提高Mysql的检索速度。
  • 索引可以帮助我们进行排序以避免使用临时表
  • 索引可以将随机的I/O转为顺序的I/O 当然 后面两点都是说的B-树索引
    索引是不是越多越好?
    不是,过多的索引会降低更新表的速度,如对表进行DML。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
    MySQL常用的索引
    普通索引INDEX:加速查找
    唯一索引:主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复) -唯一索引UNIQUE:加速查找+约束(不能重复)
    联合索引: -PRIMARY KEY(id,name):联合主键索引 -UNIQUE(id,name):联合唯一索引 -INDEX(id,name):联合普通索引
    如何使用索引?
    mysql中的primary key,unique,联合唯一也都是索引,这些索引除了加速查找以外,还有约束的功能。
    创建/删除索引的语法

#方法一:创建表时
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
#方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
#方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
#删除索引:DROP INDEX 索引名 ON 表名字;

参考文章:https://segmentfault.com/a/1190000003072424
https://www.jb51.net/article/140749.htm(语法示例全)

Mysql知识点二:事务

事务是什么?
.一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
为什么使用事务?
事务主要用于处理操作量大,复杂度高的数据。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
使用事务的条件?
1)只有使用了 Innodb 数据库引擎的数据库或表才支持事务;
2)事务只和DML(insert,update,delete)语句有关,或者说DML语句才有事务。
事务的四个特性(ACID)
1)原子性(Atomicity,或称不可分割性)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2)一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
3)隔离性(Isolation,又称独立性)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
4)持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务的sql语句

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚(回滚会结束用户的事务,并撤销正在进行的所有未提交的修改)
  • COMMIT 事务确认(提交事务,并使已对数据库进行的所有修改成为永久性的)

    在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
    事务的隔离级别:(设置的隔离级别越高越影响数据库性能)
        读未提交
       == SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITED;#修改事务隔离级别未读已提交,也可以是其他级别==
        读已提交
        可重复读
        串行化
        
     事务并发访问可能引发的问题
        更新丢失(一个修改覆盖另一个修改):例如一个事务A修改了某行数据,而其他事务B也修改了该行数据。MySQL的锁机制可以解决该问题。
        脏读(一个事务读到另一个事务未提交的数据):例如一个事务A修改了某行数据,但是未提交,而是回滚了,而其他一个事务B获取该事务修改后却回滚的数据,从而产生问题。将事务隔离级别设置在读已提交之上可以解决该问题。
        不可重复度(多次读取同一数据,结果不一致):例如一个事务A一直读取某行数据,但有其他事务B对该行数据进行了修改,事务A发现读取的数据不一致,从而产生数据不可靠问题。将事务隔离级别设置在可重复读之上可以解决该问题(保证读的数据一致)。
        幻读(读取到不存在的数据,或读取到的数据消失了):例如一个事务A读取发现数据X不存在,但事务B添加了数据X,事务A发现X凭空产生了(与不可重复读很像,但它强调的是插入和删除数据)。将事务隔离级别设置在串行化可以解决该问题。在快照读读情况下,通过MVCC来避免幻读。在当前读读情况下,通过next-key来避免幻读。

参考文章:https://blog.csdn.net/w_linux/article/details/79666086

Mysql知识点三:锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。(锁机制用于管理对共享资源的并发访问。)
当多个用户并发地存取数据时,在数据库中就可能会产生多个事务同时操作同一行数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据的一致性。
锁的分类

1、按锁的粒度划分,可分为表级锁、行级锁、页级锁(mysql)
2、按锁级别划分,可分为共享锁(读锁)、排他锁(写锁)
3、按使用方式划分,可分为乐观锁、悲观锁

各类sql语句加锁机制
https://www.cnblogs.com/leohahah/archive/2018/04/17/8863422.html

参考文章:https://segmentfault.com/a/1190000014133576
https://blog.csdn.net/qq_32679835/article/details/93745182

你可能感兴趣的:(Mysql)