mysql连接执行语句流程
1.1连接管理和安全性
连接服务器时,服务端会对其认证。
客服端连接,服务器会缓存线程。
1.2优化和执行
解析查询,缓存
事务 原子性,一致性,隔离性,持久性
START TRANSACTION
COMMIT
ROLLBACK
隔离级别 READ COMMITTED|REPEATABLE READ|SERIALIZABLE|uncommit]
设置mysql的隔离级别:set session transaction isolation level 设置事务隔离级别
查看当前事物级别:SELECT @@tx_isolation;
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
设置mysql的隔离级别:set session transaction isolation level 设置事务隔离级别
查看设置结果:SELECT @@tx_isolation;
死锁
死锁检测和死锁超时机制,
InnoDB 将最少行级排他锁进行事务回滚,重新执行死锁事务
事务日志(自动提交)
常用数据库都支持事务,那么事务是如何实现的呢?为什么即便在事务执行过程中发生宕机,数据库依然能够保证事务的正常呢?
Mysql实现事务是通过事务日志来实现的。关于事务日志,有以下几个点需要记住。
1,事务日志是Innodb特有的日志。
2,使用事务日志,可以提高事务的执行效率。怎么提高呢?存储引擎在修改数据时,只修改数据在内存中的拷贝,再把修改行为记录到事务日志中。事务日志是保存在磁盘的,所以一旦修改数据的行为写入到事务日志,就不用担心丢失了。这样,每次修改数据,就不用每次都把修改的数据写回到磁盘。所以,使用事务日志,能够提高事务的执行效率。
3,修改事务的行为写入到磁盘上的事务日志时,效率会低吗?不会。事务日志采用的是追加的方式,是在一小块磁盘区域的连续写入,不存在频繁移动磁头的问题,所以,写入事务日志的效率也不低。
4,内存中被修改的数据,什么时间写回到磁盘呢?内存中被修改的数据,会在后台慢慢写回到磁盘,尽量不影响正常的业务。
mysql> show variables like "AUTOCOMMIT";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)
在事务中混合使用存储引擎:
事务由存储引擎实现,InnoDB和MYISAM表,联合使用,无法回滚。大多数事务的实现不是简单的
mysql也支持 LOCK UNLOCK,这是在服务层实现。
多版本并发控制:通过保存数据在某个时间的快照实现、加二列,创建的时间,删除的时间
查询表的相关信息 show tables status like "user"
间隙锁 mvcc实现 repeatable read
select语句
case语句
mysql> select count(*),case when mac_address >=1 then "123" when mac_address<5 then "222" else "ok" end as aaa from device group by aaa ;
+----------+-----+
| count(*) | aaa |
+----------+-----+
| 462838 | 123 |
| 615767 | 222 |
+----------+-----+
2 rows in set (0.66 sec)
concat函数
mysql> select concat(ddns_name,mac_address) from device where mac_address=3;
+-------------------------------+
| concat(ddns_name,mac_address) |
+-------------------------------+
| kzbbEsdfsdfas |
+-------------------------------+
1 row in set (0.00 sec)
rand函数
mysql> select ddns_name,mac_address from device order by rand() limit 5;
+-----------+-------------------+
| ddns_name | mac_address |
+-----------+-------------------+
| dlcd |3 |
| skae |4 |
| du59 |4 |
| z6f |4 |
| jf95 |1 |
+-----------+--------------- +
5 rows in set (1.89 sec)
coalesceh函数
mysql> select coalesce(used,111) as a,count(*) from device where mac_address > "asf" group by a;
+------+----------+
| a | count(*) |
+------+----------+
| 1 | 35717 |
| 111 | 99441 |
+------+----------+
2 rows in set (0.50 sec)
order by语句
select used,ddns_name from device order by used,ddns_name desc;
空值排序
select enna,sal,comm from (select enna,case when comm is null when o else 1 end as is_null from emp)x order by is_null,comm
substr函数
mysql> select used,ddns_name from device order by substr(ddns_name,length(ddns_name)-4) desc limit 3;
+------+-----------+
| used | ddns_name |
+------+-----------+
| 1 | fffff |
| 1 | ffffe |
| 1 | ffffd |
+------+-----------+
使用视图
mysql> create view V as select mac_address,ddns_name from device limit 3
-> ;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from V;
+-------------------+-----------+
| mac_address | ddns_name |
+-------------------+-----------+
| sadfadsf | sdf58 |
|sdfasdf | asdfe |
| sdfasdf | aasdf |
+-------------------+-----------+
3 rows in set (0.00 sec)