Mysql
Posted ming-long
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql相关的知识,希望对你有一定的参考价值。
数据库事务(Database Transaction):
是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
简单的说:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。
事务的四大特性(ACID):
(1)原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
(2)一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号金额之和应该是不变的。
(3)隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据.
(4)持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
mysql中的事务:
- 开启事务:start transaction;
- 结束事务:commit(提交事务)或rollback(回滚事务)。
事务并发读问题:
多个事务对相同的数据同时进行操作,这叫做事务并发。
在事务并发时,如果没有采取必要的隔离措施,可能会导致各种并发问题,破坏数据的完整性等。这些问题中,其中有三类是读问题,分别是:脏读、不可重复读、幻读。
(1)脏读(dirty read):读到另一个事务的未提交更新数据,即读取到了脏数据;
例如:A给B转账100元但未提交事务,在B查询后,A做了回滚操作,那么B查询到了A未提交的数据,就称之为脏读。
(2)不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改(是针对修改操作)
例如:在事务1中
1.1 事务隔离级别:
事务隔离级别分四个等级,在相同数据环境下,对数据执行相同的操作,设置不同的隔离级别,可能导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力也是不同的。
set tx_isolation=‘read-uncommitted‘;
1、READ UNCOMMITTED(读未提交数据)
安全级别最低, 可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)
性能最好(不使用!!)
2、READ COMMITTED(读已提交数据)(Oracle默认)
防止脏读,没有处理不可重复读,也没有处理幻读;
性能比REPEATABLE READ好
3、REPEATABLE READ(可重复读)(MySQL默认)
防止脏读和不可重复读,不能处理幻读问题;
性能比SERIALIZABLE好
4、SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;
存储引擎
show engines
show variables like ‘%storage_engines%‘
InnoDB
MyISAM
SQL性能下降原因:
SQL执行顺序
手写
机读
总结:
索引
索引是存储引擎用于快速查找记录的一种数据结构
索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分关键,因为Mysql只能高效的使用索引的最左前缀列。
分类:索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
索引的类型
B-tree索引 :当人们讨论索引的时候,如果没有特别指明类型,那多半说的是B-tree索引,它使用B-Tree数据结构来存储数据(按照顺序),大多数Mysql引擎都支持这种索引,Archive除外。
哈希索引:哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引是将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在Mysql中,只有Memory引擎显式支持哈希索引。
空间数据索引(R-Tree):MyISAM表支持空间索引,可以用作地理数据存储。
全文索引:全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。
可以使用SHOW INDEX FROM table_name;
查看索引详情
索引种类
1.普通索引 INDEX
最基本的索引,它没有任何限制。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);
创建普通索引
2.主键索引 PRIMARY KEY
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
注意:一个表只能有一个主键
3.唯一索引 UNIQUE
唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
可以通过ALTER TABLE table_name ADD UNIQUE (column);
创建唯一索引
可以通过ALTER TABLE table_name ADD UNIQUE (column1,column2);
创建唯一组合索引
4.组合索引 INDEX
组合索引,即一个索引包含多个列。多用于避免回表查询。
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);
创建组合索引
5.全文索引 FULLTEXT
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column);
创建全文索引
索引一经创建不能修改,如果要修改索引,只能删除重建。可以使用DROP INDEX index_name ON table_name;
删除索引。
索引的优缺点
1、优点:
2、 缺点:
视图
视图本身是一个虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,它返回的数据是Mysql从替他表中生成的。视图和表是在同一个命名空间。
不能对视图创建触发器,也不能使用drop table 命令删除视图。
以上是关于Mysql的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段
使用 json rereiver php mysql 在片段中填充列表视图
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段