1.常用指令
mysql -uroot -p12345 #用于连接数据库
show databases/tables #查看有哪些数据库
use 数据库名 #进入该数据库
desc 表名 #直观显示表的基础信息,describe的缩写
select connection_id() from dual; #显示当前连接的id
select @@autocommit; #查看aurocommit的效果
DDL数据定义语句
数据库
create database xxx #用于创建数据库
drop database xxx #用于删除数据库
表
create和drop同上 #创建和删除表
#可以在数据类型后面加 not null,primary key,unique之类的
Create table If Not Exists Department (Id int, Name varchar(255));
Truncate table 表名 #清空表内所有内容
desc 表名 #直观显示表的基础信息
show create table 表名 \g #显示创建表的具体信息
#涉及表修改
alter table 表名 ?????
rename 新表名 #修改表名
以下也可以在最后加入first使得字段在第一个,或者after 字段名表示字段增加在某个字段后
modify 字段名 字段类型 #修改字段类型
add 字段名 字段类型 #增加字段
drop 字段名 #删除字段
change 旧字段名 新字段名 新字段类型 #修改字段
DML数据操纵语句
#插入语句
insert into 表名 (字段1,字段2...)values(值1,值2,...) 如果要插入多行,values后使用多个括号即可
#更新语句
UPDATE 数据表名1,数据表名2 SET 字段名1=新的字段值,字段名2=新的字段值 WHERE 条件表达式
#删除语句
delete from 数据表名 where 条件表达式
#查询语句
#排序规则,第一个排序字段相同,那就下一个排序字段
ORDER BY column1 ASC,column2 DESC;
#分页
limit 3 #相当于 limit 0,3 最开始的3条记录,常常配合order by使用
#正则
where id regexp ‘正则字符串’
#随机排序
order by rand()
DCL数据控制语句
DBA用来管理系统中的对象权限时使用
元数据
标度和精度
标度:有效数字
精度:小数位后
浮点数float和double不用这个,decimal默认是decimal(10,0)所以要指定标度和精度
BIT类型
bit类型的字段位数为1-64位
bit类型的字段,查询的结果需要bin(id)或者hex(id)才能显示结果
索引
show index from 表名 #展示表的索引
#建立索引
CREATE INDEX index_name ON table_name (column1,column2...)
ALTERTABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
B树索引都能用,hash索引只能用于=,>,和<。
当数据进行了类型转换时,就不会走索引,所以例如字符串列,where时一定要记得加上单引号将条件引用起来
前缀索引是指在字符串类型的列上构建索引时,指定索引的位数
最左前缀原则是指在查询时,使用的查询条件是复合索引时,只要满足,索引的前后关系是col1开头才能使用索引,可以是col1,col3,中间没有使用col2也会走索引。但不可以是col1,col3,col2,这样就不会走索引。
锁
show status like ‘table%’ #如果table_locks_waited的值很高,那就说明表的征用情况很多
读写锁,读读可以,读写和写写不可以。
但是对于可重入的读写锁而言就不一样了,在线程已经获取写锁的情况下,可以再次获取读锁;已获取读锁的情况下再次获取读锁。
共享锁:lock in share mode,可以和意向共享锁和共享锁共存。
排他锁:for update,不能与任何锁共存
意向锁:有意向共享锁和意向排他锁,在获得锁前得先获得意向锁,意向锁之间可以共存,意向共享锁还可以和共享锁共存。
在可重复读的隔离性下select for update如果两个线程同时对于一个不存在的记录使用,那都会加锁成功,会造成死锁。将隔离级别改成读已提交可以避免这种情况。
行锁
行锁是加在索引上的,所以如果没有任何普通索引,那么将加在聚簇索引即主键上,而这会形成表锁。
所以必须要有普通索引才能形成行锁。
另外如果因为执行计划没有走索引,所以也可能导致表锁。
使用范围条件加锁,会形成间隙锁;或者在相等的条件给一个不存在的记录加锁也会形成间隙锁。
分布式事务 XA
分布式事务也是二阶段事务的一种,DDL语句无法被回滚
有两个重要角色1.资源管理器RM 2.事务管理器TM
资源管理器即管理每一个本地事务,称为执行器
事务管理器管理整个事务的提交,称为协调器
#如果想查其他情况,可以使用*,后面的where条件不用的话就是当前数据源的全部数据
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id();
#改变一次连接或者一次会话的自动提交事务机制(也可以直接改全局,用gloab)
#一次会话可以有多次连接,每次登录又退出
set autocommit=0或者set session aurocommit=0
start transaction或者begin
#回滚到指定点
savepoint test;
rollback to savepoint test;
#查看当前数据库的处于prepare状态的事务信息
xa recover;
#开启分布式事务,需要xid,xid由gtrid和bqual构成(还有一个参数是纯数字与格式有关)
xa start ‘test1’,‘db1’; #这里test1是分布式事务标识符,db1是分支限定符
xa end ‘test1’,‘db1’; #结束分支事务
xa prepare ‘test1’,‘db1’; #分支事务一阶段提交
xa commit/rollback xid; #提交或者回滚该分支,不能直接提交整个分布式事务
只有完整提交后整个才会进入binlog,所以只是prepare后还不会进入binlog,不能恢复数据,这可能导致:
a分支和b分支都prepare,b提交,a异常回滚,这时恢复数据就没有a了(不能直接提交所有)