CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ] ,
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) ENGINE = INNODB [ COMMENT 表注释 ] ;
show engines;
show create table account;
1、默认存储引擎
2、Id是自增的 下一条Id为3
3、默认字符集
4、默认排序方式
MyISAM :MongoDB取代
Memory:Redis取代
select * from user where age = 45;
B+Tree特点:
所有的数据都会出现在叶子节点
叶子节点形成一个单向链表
非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的
1、Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,…)
2、无法利用索引完成排序操作
3、查询效率高(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引)
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name,... ) ;
# name字段为姓名字段,该字段的值可能会重复
CREATE INDEX idx_user_name ON tb_user(name);
# phone手机号字段的值,是非空,且唯一的,为该字段创建唯一索引
CREATE UNIQUE INDEX idx_user_phone ON tb_user(phone);
# 为profession、age、status创建联合索引
CREATE INDEX idx_user_pro_age_sta ON tb_user(profession,age,status);
SHOW INDEX FROM table_name ;
DROP INDEX index_name ON table_name;
-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
-- 七个_
SHOW GLOBAL STATUS LIKE 'Com_______';
如果是以增删改为主,我们可以考虑不对其进行索引的优化
如果是以查询为主,那么就要考虑对数据库的索引进行优化了
show variables like 'slow_query_log';
# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
systemctl restart mysqld
SELECT @@have_profiling ;
SET profiling = 1;
-- 查看每一条SQL的耗时基本情况
show profiles;
-- 上面那一条语句会查出所有语句的query_id
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;
-- 直接在select语句之前加上关键字 explain
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;
联合索引的最左边的字段(即是第一个字段)必须存在,与编写SQL时,条件编写的先后顺序无关
explain select * from tb_user where substring(phone,10,2) = '15';
# 索引生效
explain select * from tb_user where profession like '软件%';
# 索引失效
explain select * from tb_user where profession like '%工程';
# 索引失效
explain select * from tb_user where profession like '%工%';
select * from tb_user where phone >= '17799990005';
explain select * from tb_user where profession = '软件工程';
explain select * from tb_user use index(idx_user_pro) where profession = '软件工程';
explain select * from tb_user ignore index(idx_user_pro) where profession = '软件工程';
explain select * from tb_user force index(idx_user_pro) where profession = '软件工程';
insert into tb_test values(1,'tom');
insert into tb_test values(2,'cat');
insert into tb_test values(3,'jerry');
.....
Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_test values(7,'Tom'),(8,'Cat'),(9,'Jerry');
commit;
主键乱序插入 : 8 1 9 21 88 2 4 15 89 5 7 3
主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89
# 设置参数
-- 客户端连接服务端时,加上参数 -–local-infile
mysql –-local-infile -u root -p
-- 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
-- load加载数据
load data local infile '/root/load_user_100w_sort.sql' into table tb_user
fields terminated by ',' lines terminated by '\n' ;
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [
CASCADED | LOCAL ] CHECK OPTION ]
create view stu_v_1 as select id,name from student where id <= 10;
SHOW CREATE VIEW 视图名称;
show create view stu_v_1;
SELECT * FROM 视图名称 ...... ;
select * from stu_v_1;
select * from stu_v_1 where id < 3;
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED |
LOCAL ] CHECK OPTION ]
alter view stu_v_1 as select id,name from student where id <= 10;
DROP VIEW IF EXISTS 视图名称 [,视图名称] ...
drop view if exists stu_v_1;
create or replace view stu_v_1 as select id,name from student where id <= 10 ;
insert into stu_v_1 values(6,'Tom');
insert into stu_v_1 values(17,'Tom22');
A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL
create view tb_user_view as select id,name,profession,age,gender,status,createtime
from tb_user;
create view tb_stu_course_view as select s.name student_name , s.no student_no ,
c.name course_name from student s, student_course sc , course c where s.id =
sc.studentid and sc.courseid = c.id;
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ])
BEGIN
-- SQL语句
END ;
-- 注意分号的位置上
create procedure p1()
begin
select count(*) from student;
end;
CALL 名称 ([ 参数 ]);
-- 记得加括号
call p1();
-- 查询指定数据库的存储过程及状态信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx';
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'itcast';
-- 查询某个存储过程的定义
SHOW CREATE PROCEDURE 存储过程名称 ;
show create procedure p1;
DROP PROCEDURE IF EXISTS 存储过程名称
drop procedure if exists p1;
-- 查看所有系统变量
SHOW [ SESSION | GLOBAL ] VARIABLES ;
show session variables ;
show global variables ;
-- 可以通过LIKE模糊匹配方式查找变量
SHOW [ SESSION | GLOBAL ] VARIABLES LIKE '......';
show session variables like 'auto%';
show global variables like 'auto%';
-- 查看指定变量的值
SELECT @@[SESSION | GLOBAL].系统变量名;
select @@global.autocommit;
select @@session.autocommit;
SET [ SESSION | GLOBAL ] 系统变量名 = 值 ;
set session autocommit = 1;
set global autocommit = 0;
如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量
mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置
全局变量(GLOBAL): 全局变量针对于所有的会话
会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了
-- 赋值
set @myname = 'itcast';
set @myage := 10;
set @mygender := '男',@myhobby := 'java';
select @mycolor := 'red';
select count(*) into @mycount from tb_user;
-- 使用
select @myname,@myage,@mygender,@myhobby;
select @mycolor , @mycount;
-- 变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等
DECLARE 变量名 变量类型 [default ... ] ;
SET 变量名 = 值 ;
SET 变量名 := 值 ;
SELECT 字段名 INTO 变量名 FROM 表名 ... ;
-- 声明局部变量 - declare
-- 赋值
create procedure p2()
begin
declare stu_count int default 0;
select count(*) into stu_count from student;
select stu_count;
end;
call p2();
create procedure p3()
begin
declare score int default 58;
declare result varchar(10);
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
select result;
end;
call p3();
create procedure p4(in score int, out result varchar(10))
begin
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
end;
-- 定义用户变量 @result来接收返回的数据, 用户变量可以不用声明
call p4(18, @result);
select @result;
flush tables with read lock ;
mysqldump -uroot –p1234 itcast > itcast.sql
unlock tables ;
mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql
-- 加锁:
lock tables 表名 read/write
--释放锁:
unlock tables
结论: 读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。
一旦事务提交了,意向共享锁、意向排他锁,都会自动释放
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;