--===============================事务=================================1.使用set语句来改变自动提交模式
SET autocommit =0;/*关闭*/SET autocommit =1;/*开启*/--注意:--1.MySQL是默认开启事务自动提交的--2.使用事务时应先关闭自动提交2.事务开启与结束
SET autocommit =0--关闭事务自动提交STARTTRANSACTION--标记一个事务的开启,从这个之后的sql都在同一个事务中INSERT xx
INSERT xx
COMMIT--提交:提交一个事务给数据库(成功)ROLLBACK--回滚:数据回到本次事务的初始状态(失败)SET autocommit =1--标记事务的结束,开启事务自动提交--==================了解知识(保存点)==================SAVEPOINT 保存点名称 -- 设置一个事务保存点ROLLBACKTOSAVEPOINT 保存点名称 -- 回滚到保存点RELEASESAVEPOINT 保存点名称 -- 删除保存点3.模拟转账的案例
/*
课堂测试题目
A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000
创建数据库shop和创建表account并插入2条数据
*/CREATEDATABASE`shop`CHARACTERSET utf8 COLLATE utf8_general_ci;USE`shop`;CREATETABLE`account`(`id`INT(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(32)NOTNULL,`cash`DECIMAL(9,2)NOTNULL,PRIMARYKEY(`id`))ENGINE=INNODBDEFAULTCHARSET=utf8;INSERTINTO account(`name`,`cash`)VALUES('A',2000.00),('B',10000.00);-- 转账实现SET autocommit =0;-- 关闭自动提交STARTTRANSACTION;-- 开始一个事务,标记事务的起始点UPDATE account SET cash=cash-500WHERE`name`='A';UPDATE account SET cash=cash+500WHERE`name`='B';COMMIT;-- 提交事务rollback;--回滚SET autocommit =1;-- 恢复自动提交
事务隔离级别
三种并发读与四种事务隔离级别的总结
索引
索引的作用
提高查询速度
确保数据的唯一性
索引的分类与基本语法
1.主键索引 PrimaryKey
主键索引只能有一个,对应的列的值不能重复
2.唯一索引 Unique
唯一索引可能有多个,每个唯一索引对应的列的值不能重复
3.常规索引 Index/Key
默认的 每一列的值可以相同
4.全文索引 FullText
快速定位特定数据
5.基本语法
SHOWINDEXFROM student;--显示所有的索引信息CREATEINDEX id_app_user_name ON app_user(name);--创建普通索引 CREATE INDEX 索引名 on 表(字段)DROPINDEX 索引名 ON 表名;--删除索引ALTERTABLE 表名 DROPPRIMARYKEY;--删除主键索引EXPLAINSELECT*FROM student;--EXPLAIN分析sql语句执行性能ALTERTABLE student ADD FULLTEXT INDEX stuname(stuname);--增加一个全文索引 INDEX 后面的为索引名,括号里为列名EXPLAINSELECT*FROM student WHEREMATCH(stuname) AGAINST('love');--使用全文索引-- 全文搜索通过 MATCH() 函数完成-- 搜索字符串作为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
索引效率的测试
1.批量插入100W条数据
--建表app_userCREATEDATABASE`shop`CHARACTERSET utf8 COLLATE utf8_general_ci;USE`shop`;CREATETABLE`app_user`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(50)DEFAULT''COMMENT'用户昵称',`email`varchar(50)NOTNULLCOMMENT'用户邮箱',`phone`varchar(20)DEFAULT''COMMENT'手机号',`gender`tinyint(4)unsignedDEFAULT'0'COMMENT'性别(0:男;1:女)',`password`varchar(100)NOTNULLCOMMENT'密码',`age`tinyint(4)DEFAULT'0'COMMENT'年龄',`create_time`datetimeDEFAULTCURRENT_TIMESTAMP,`update_time`timestampNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='app用户表';--批量插入数据100w条DROPFUNCTIONIFEXISTS mock_data;DELIMITER $$
CREATEFUNCTION mock_data()RETURNSINTBEGINDECLARE num INTDEFAULT1000000;DECLARE i INTDEFAULT0;WHILE i<num DOINSERTINTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES(CONCAT('用户', i),'24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));SET i=i+1;ENDWHILE;RETURN i;END;SELECT mock_data();2.效率测试
--无索引SELECT*FROM app_user WHERE name ='用户9999';--0.993secEXPLAINSELECT*FROM app_user WHERE name ='用户9999';--rows: 992759 992759次找到--创建普通索引 CREATE INDEX 索引名 on 表(字段)CREATEINDEX id_app_user_name ON app_user(name);SELECT*FROM app_user WHERE name ='用户9999';--0.001secEXPLAINSELECT*FROM app_user WHERE name ='用户9999';--rows: 1 1次找到
索引创建的原则
索引不是越多越好
不要对经常变动的数据加索引
小数据量的表建议不要加索引
索引一般应加在查找条件的字段
用户权限管理
--用户信息表
mysql.user--创建用户 CREATE USER 用户名 IDENTIFIED BY [PASSWORD]CREATEUSER kuangshen IDENTIFIED BY'123456';--删除用户DROPUSER 用户名
--修改当前用户密码SET PASSWORD = PASSWORD('密码');--修改指定用户密码SET PASSWORD FOR 用户名 = PASSWORD('密码');--重命名用户RENAMEUSER old_user TO new_user
--用户授权 ALL PRIVILEGES所有权限GRANTALLPRIVILEGESON*.*TO 用户名;--查询权限SHOW GRANTS FOR 用户名;--查看指定用户权限SHOW GRANTS FOR root@localhost;--查看当前用户权限--撤销权限REVOKEALLPRIVILEGESON*.*FROM 用户名;--撤销所有权限