1、进入mysql
登陆数据库 | mysql -uroot -p |
---|
2、增删改查
对应操作 | 命令 | 备注 |
---|---|---|
增 | insert into 表名(字段1,字段2,…) values(值1,值2,…); | |
删 | delete from 表名 where…; | |
改 | update 表名 set 修改的值 where …; | |
查 | select 字段 from 表名 where …; |
左右连接查询 | 命令 |
---|---|
左连接 | select * from table1 left join table2 on table1.name = table2.name; |
右连接 | select * from table1 right join table2 on table1.name = table2.name; |
3、数据库索引
① mysql的底层引擎为InnoDB,索引是一种数据结构;
② 在mysql中采用的方式为B-tree,一般情况下,B-tree和B+tree索引相同;
③ B-tree的高度决定了索引搜索的次数,3层也就是搜索三次即可找到目标数据;
④ B-tree的数据都是存放在叶节点当中;
对应操作 | 命令 | 备注 |
---|---|---|
创建单值索引 | create index 索引名 on 表名(字段); | |
创建唯一索引 | create unique index 索引名 on 表名(字段); | 字段属性为primary key的为主键索引,主键索引不允许出现null |
创建联合索引 | create index 索引名 on 表名(字段1,字段2,…); | 遵循最左匹配原则,先从最左索引开始,索引不一定全部使用 |
查看索引 | show index on 表名; |
下面语句也可创建索引:
alter table 表名 add index 索引名(需要创建索引的字段)
4、事务
定义:事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性。
事务的四种特性:①原子性;②一致性;③隔离性;④持久性
-
并发事务带来的问题
-相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。
更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题——最后的更新覆盖了其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改保存其更改副本的编辑人员覆盖另一个编辑人员所做的修改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问题
脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”。
不可重复读(Non-Repeatable Reads):一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”。
幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。 -
事务隔离级别
“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机 制来解决。
事务的四种隔离界别级别:
5、数据库锁机制
- 锁的分类:
根据类型 | 特点 |
---|---|
操作类型 | |
a.读锁 (共享锁) | 读锁:多个数据可以同时进行,互不干扰; |
b.写锁(互斥锁) | 读锁:多个数据可以同时进行,互不干扰;写锁:当前写操作未执行完毕,无法进行其他读写操作 |
操作范围 | |
a.表锁 | 表锁:一次性对一张表加锁,存储引擎MyISAM默认使用,特点是开销小,加锁快,无死锁,缺点是锁的范围大,容易发生锁冲突,并发度低 |
b.行锁 | 一次性对一条数据加锁,存储引擎InnoDB默认使用,特点是开销大,加锁慢,容易发生死锁;锁的范围较小,不容易发生所冲突,并发度高(很小概率发生高并发问题:脏读,幻读,不可重复读) |
c.页锁 |
△死锁:各自对数据进行了锁,并且需要对方的数据,但是双方因为上了锁,互相给不了数据,发生死锁。
- 锁操作:
锁操作 | 命令 | 备注 |
---|---|---|
增加锁 | lock table 表1 read/write , 表2 read/write , …; | |
释放锁 | unlock tables; | |
查看加锁的表 | show open tables; | 结果右边的值In_use/Name_locked如果为1,代表已加锁 |
读锁 | lock table 表1 read; | 如果用户对表1加读锁,只能对表1进行读操作,不能进行写操作,不能对其他表进行读写操作;其他用户只能对表1进行读操作,写操作需要等待读锁释放,可以对其他表进行读写操作 |
写锁 | lock table 表1 wirte | 加写锁,可以对表1进行任何操作,但不能操作其他表;其他用户可以对表1进行增删改查,但是要等写锁释放 |
查看表锁的严重程度 | show status like ‘table%’; | Table_locks_immediate 立刻能获取到的锁;Table_locks_waited 需要等待的表锁数(越大说明存在越大的锁竞争),两者比例>5000,采用InnoDB,否则采用MyISAM |
行锁 | 会话a对数据x进行行锁,其他会话必须等待会话a结束事物,才能对数据x进行操作;行锁通过事务解锁。如果会话操作不同数据,互不影响。 |
行锁注意事项:
①如果发在类型转换,则索引失效,行锁变为表锁
②行锁特殊情况----间隙锁:值在范围内,但却不存在(mysql自动会给间隙加锁)
如果linelock中没有id = 7 的数据,操作以下命令:
update linelock set name = 'x' where id > 1 and id <9;
间隙锁:程序会自动给id = 7数据加间隙锁
行锁:会给where后面的范围加锁