Mysql数据库四大特性、事物的四个隔离、基本MySQL语句、独立表空间

 

本人学习mysql的时候感觉笔记有点散所以自己做了一个整合,而且有些概念介绍的太官方了,所以自己根据理解总结了一下。(有不对的请指点!)

 

mysql:

sql:关系型数据库:(复杂的关系形数据库)。

nosql:非关系型数据库:(储存的格式很简单)

key,value(memcached),user1:1,user2:2(存在内存里)

 

 

事务:一组原子性的SQL查询,或者是一个或多个sql语句组成的独立工作单元;操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

 

事务的特性:

(1)原子性(Atomicity):强调事务是一个整体,要么都执行,要不都不执行。

(2)一致性(Consistency):事务执行的结果必须是使从一个一致性状态变到另一个一致性状态,强调数据的一致性。

(3) 隔离性(Isolation):指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到。

(4)持久性(Durability):意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。

 

不考虑事务隔离性会引发的四个问题:

(1)脏读:一个事务读到另一个事务未提交的数据(就是数据不统一)。

说明:有两个用户a和b在使用同一个数据库A,a用户修改数据库数据但还未提交,这时候用户b还是能读取a用户没修改前的数据这就是脏读。

  (2)不可重复读:一个事务读到另一个事务已提交的数据,强调Update(更新)。

说明:有一个学生信息表,里面有一条数据[小明 男 25岁];事务1现在读取这个条数据,将“小明”修改为“张三”,但是还没有提交到数据库中;这个时候事务2来进行对这条数据的操作,事务2需要两次读取这条数据,事务2第一次读取数据是在事务1还没有提交的时候,读出的数据依然是[小明 男 25岁],但是事务2在第二次读取的时候,小明已经提交了,这个时候同样的读取操作结果确实[张三 男 25岁],事务2两次读取的结果不一致,这就是不可重复读问题。

(3)虚度/幻读:一个事务读到另一个事务已提交的数据,强调Insert。

(4)丢失更新: 两个事务同时修改数据,后提交事务覆盖了先提交事务的结果。

说明:从字面上理解就行了,就是前一个修改的数据丢失了。

 

事物的隔离级别:四个

ISOLATION_DEFAULT:使用数据库默认的隔离级别。 

ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。 

ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致(不可以重复度),不发生脏读,可导致幻读。 

ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。

ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读(等级最低)。 

##个人感觉了解两款主流的引擎是很有必要的,对数据库操作和理解就很有帮助。

主流引擎区别:

INNODB:支持事务处理与外键和行级锁,不支持全文索引,可以做回滚以及系统崩溃修复能力。(生产环境肯定使用这款,因为安全性比较高。)InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。主键范围更大,最大是MyISAM的2倍

MYISAM:读取的性能高,但是不支持事物,出错了,就不能回滚回来了。不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

 

日志管理:

二进制日志:mysqldump备份还原。

错误日志:查看mysql服务的错误日志。

慢查询日志:查看慢查询的日志。

通用查询日志:线上不提倡开启,io会过高。

注意:不能添加太多索引因为这样会使得写入的时候会变慢,所以一般使用的是联合索引。

 

Mysql语言例子:

插入单个数据:

Mysql>  INSERT INTO cml(I d,`name`) VALUE(1,'cml');

插入多个数据:

Mysql>  INSERT INTO cml(id,`name`)VALUE(2,'zhangfei'),(3,'zhaoyun');

 

查看数据:

Mysql>  SELECT * FROM cml;+----+----------+| id | name     |+----+----------+|  1 | cml ||  2 | zhangfei ||  3 | zhaoyun |+----+----------+

 

建议程序员写查询的时候:

Mysql>  SELECT id,name FROM cml;+----+----------+| id | name     |+----+----------+|  1 | cml ||  2 | zhangfei ||  3 | zhaoyun |+----+----------+

 

加条件的查看:

Mysql>  SELECT id,name FROM cml WHERE id=3;+----+---------+| id | name    |+----+---------+|  3 | zhaoyun |+----+---------+

 

 

Mysql>  SELECT * FROM cml LIMIT 1;+----+---------+| id | name    |+----+---------+|  1 | cml |

 

Mysql>  SELECT * FROM cml ORDER BY id DESC LIMIT 1;+----+---------+| id | name    |+----+---------+|  3 | zhaoyun |+----+---------+

 

4、更新字段的值:

Mysql>  UPDATE cml set name='guanyu' where id=1;Query OK, 1 rowaffected (0.00 sec)Rows matched:1  Changed: 1  Warnings: 0

 

5、删除id=1的值

Mysql>  DELETE FROM cml WHERE id=2;Query OK, 1 rowaffected (0.00 sec)

6、DELETE 删除的时候计数器没有被清空:

Mysql>  DELETE FROM cml;           Query OK, 2 rowsaffected (0.00 sec) Mysql>  select * FROM cml;Empty set (0.00sec) Mysql>  INSERT INTO cml(`name`) VALUE('machao'); Query OK, 1 rowaffected (0.00 sec) Mysql>  select * FROM cml;                      +----+--------+| id | name   |+----+--------+|  4 | machao |+----+--------+

 

 

7、把表结构ID修改id自动增长,然后插入数据:

Mysql>  CREATE TABLE `cml` ( `id` int(11) NOT NULLAUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ); Mysql>  INSERT INTO cml(`name`) VALUE('zhangfei');Query OK, 1 rowaffected (0.00 sec) 8、清空计数器:Mysql>  TRUNCATE cml;Query OK, 0 rowsaffected (0.00 sec) Mysql>  INSERT INTO cml(`name`) VALUE('machao');Query OK, 1 rowaffected (0.00 sec) Mysql>  select * FROM cml;                          +----+--------+| id | name   |+----+--------+|  1 | machao |+----+--------+1 row in set(0.00 sec)

 

9、插入测试数据:

Mysql>  CREATE TABLE `cml` ( `id` int(11)AUTO_INCREMENT, `name` varchar(20) , age int, PRIMARY KEY (`id`) );Query OK, 0 rowsaffected (0.00 sec) Mysql>  INSERT INTO cmlVALUE(1,'zhangfei',20),(2,'zhaoyun',25),(3,'machao',30);Query OK, 3 rowsaffected (0.00 sec)Records: 3  Duplicates: 0 Warnings: 0 Mysql>  select * from cml;+----+----------+------+| id | name     | age |+----+----------+------+|  1 | zhangfei |   20 ||  2 | zhaoyun |   25 ||  3 | machao  |   30 | Mysql>  SELECT name FROM cml WHERE age>25;+--------+| name   |+--------+| machao |+--------+ Mysql>  SELECT name FROM cml WHERE age>25 ANDage<=30;+--------+| name   |+--------+| machao |

 

按照年龄排序:

Mysql>  SELECT * FROM cml ORDER BY age;+----+----------+------+| id | name     | age |+----+----------+------+|  4 | wanggai |   18 ||  1 | zhangfei |   20 ||  2 | zhaoyun |   25 ||  3 | machao  |   30 |+----+----------+------+

 

独立表空间:

 

优点:

每个表都有自已独立的表空间。

每个表的数据和索引都会存在自已的表空间中。

可以实现单表在不同的数据库中移动。

空间可以回收(除drop table操作处,表空不能自已回收)

       1Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以          通过:alter table TableName engine=innodb;回缩不用的空间。

       2、对于使innodb-pluginInnodb使用turncate table也会使空间收缩。

       3、对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且            还有机会处理。

缺点:

 

单表增加过大,如超过100G

 

结论

 

共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整一下:innodb_open_files InnoDB Hot Backup(冷备)的表空间cp不会面对很多无用的copy了。而且利用innodb hot backup及表空间的管理命令可以实现单现移动。

 

innodb_file_per_table设置.

 

开启方法:

my.cnf[mysqld]下设置

innodb_file_per_table=1

查看是否开启:

mysql> show variables like'%per_table%';+-----------------------+-------+| Variable_name        | Value |+-----------------------+-------+| innodb_file_per_table | ON   |+-----------------------+-------+1 row in set (0.02 sec)

 

关闭独享表空间:

innodb_file_per_table=0

关闭独立的表空间

mysql> show variables like'%per_table%';+-----------------------+-------+| Variable_name         | Value |+-----------------------+-------+| innodb_file_per_table | OFF   |+-----------------------+-------+1 row in set (0.01 sec)