当前位置:网站首页>mysql的增删改查,mysql常用命令
mysql的增删改查,mysql常用命令
2022-06-12 19:05:00 【淡泪无痕】
mysql的增删改查,mysql常用命令
编译安装mysql/mariadb文档:mysql编译/mariadb编译
yum安装mysql 8.0
vi /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql8.0
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-8.0-community-el7-x86_64/
gpgcheck=0
yum -y install mysql-community-server
systemctl start mysqld
systemctl enable mysqld
mysql 8.0需要手动查看密码,然后修改密码后才能登录
cat /var/log/mysqld.log |grep password
mysql -u root -p'<qdmCZnRs6WV'
alter user 'root'@'localhost'IDENTIFIED BY 'Test12#$'; 修改密码,重新登录后即可使用
1、CREATE语句
1.1 CREATE 和DATABASE数据库
官网文档:CREATE-DATABASE
HELP CREATE 查看帮助
HELP CREATE DATABASE
CREATE DATABASE test1; 创建数据库,(按数据库默认字符集和排序创建)
CREATE DATABASE test2 CHARACTER SET utf8mb4 collate utf8mb4_0900_ai_ci; 指定数据库字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci
1.2 CREATE和TABLE(表格)
官网文档:CREATE-TABLE
表格的字段类型:字段类型
HELP CREATE TABLE
进入数据库才能创建表格
use test1;
创建student表,字段(列)为id,name,age,gender,后面的是字段类型和属性
create table student (id int unsigned primary key auto_increment,name varchar(10),age tinyint unsigned,gender enum('M','F') default 'M');
unsigned 不设置符号
primary key 设置为主键,不能为空
auto_increment 自动增长
tinyint 单个字节整数
int 整数
enum('M','F') 单选项
default 'M' 默认值
1.3 CREATE和USER(用户)
官网文档:CREATE-USER
HELP CREATE USER
创建账户aa,密码为Test12#$,访问IP段为192.168.116.%
CREATE USER 'aa'@'192.168.116.%' IDENTIFIED BY 'Test12#$';
mysql 8.0的密码插件默认是caching_sha2_password,指定老版本的密码插件方式为mysql_native_password
CREATE USER 'bb'@'192.168.116.%' IDENTIFIED WITH mysql_native_password BY 'Test12#$';
1.4 CREATE和VIEW
SELECT user,host,plugin FROM mysql.user; 查询某个表格的部分数据
use test2; 进入数据库
将查询的部分表格数据保存为视图(其实相当于另存为表格,不过格式有所不同)
CREATE VIEW t_view AS SELECT user,host,plugin FROM mysql.user;
SHOW TABLES; 查看视图生成
SELECT * FROM t_view; 查看视图的内容
1.5 CREATE和FUNCTION(自定义函数)
创建一个表格
CREATE TABLE t1 (tid int,name varchar(20));
INSERT t1(tid,name)VALUES('1','aa'),('2','bb'),('3','cc');
自定义一个函数,当函数的值=表格的某一列的值,删除行
mysql 8.0版本需要开启这个才能自定义函数
set global log_bin_trust_function_creators=ON;
use test2; 进入数据库
创建函数 //开始,//结尾
DELIMITER //
CREATE FUNCTION deleteT1(id SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN
DELETE FROM t1 WHERE tid = id;
RETURN (SELECT COUNT(*) FROM t1);
END//
DELIMITER ;
SELECT deleteT1(1); 调用函数,删除t1中tid为1的行
SELECT * FROM t1; 再次查看t1表格
函数解析:
DELIMITER // 表示把原本的结束符;改为//
下面表示创建一个函数deleteT1,里面有2个字段
CREATE FUNCTION deleteT1(id SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN 这个表示函数开始
DELETE FROM t1 WHERE tid = id; 定义当t1表格的tid=函数的id的值时,删除行
RETURN (SELECT COUNT(*) FROM t1); 返回t1表格剩下的行数
END// 结束符
DELIMITER ; 将//还原为;
1.6 CREATE和PROCEDURE(存储过程)
mysql 8.0版本需要开启这个才能自定义函数
set global log_bin_trust_function_creators=ON;
use test2; 进入数据库
创建表格
CREATE TABLE t1(id int auto_increment primary key,name char(10),age int);
创建存储过程
delimiter $$
create procedure PRt1()
begin
declare i int;
set i = 1;
while i < 1001
do insert into t1(name,age) values (concat('aa',i),i);
set i = i +1;
end while;
end$$
delimiter ;
存储过程解析
delimiter $$ #将结束符;转换为$$
create procedure PRt1() #创建存储过程PRt1
begin #开始存储过程
declare i int; #定义变量i,类型为整数型
set i = 1; #设置i的初始值
while i < 1001 #定义循环,当i<1001
#当i<1001时,不断插入数据到t1表格
do insert into t1(name,age) values (concat('aa',i),i);
set i = i +1; #定义i=i+1,不断递增
end while; #结束while循环
end$$ #结束存储过程
delimiter ; #将结束符$$还原为;
call PRt1; 调用存储过程
SELECT count(*) FROM t1; 查看插入了1000条数据
1.7 CREATE和TRIGGER(触发器)
触发器:当某个条件发生时,触发另外一个条件
创建2个表格
CREATE TABLE t1(id int,name varchar(20)); 创建t1表,2个字段
CREATE TABLE t2(t1_count int DEFAULT 0); 创建t2表
INSERT INTO t2(t1_count)VALUES(0); 插入t2的第一行的值为0
SELECT * FROM t1; 查看t1表为空
SELECT * FROM t2; 查看t2表的行值为0
创建触发器
CREATE TRIGGER t1_insert
AFTER INSERT
ON t1 FOR EACH ROW
UPDATE t2 SET t1_count=t1_count+1;
触发器解析
CREATE TRIGGER t1_insert #创建触发器t1_insert
AFTER INSERT #通过插入触发
ON t1 FOR EACH ROW #当t1表格每个行增加时
UPDATE t2 SET t1_count=t1_count+1; #更新t2表格的值+1
INSERT t1(id,name)VALUES('1','aa'),('2','bb'); 对t1表格插入2条数据
SELECT * FROM t1; 查看数据生成
SELECT * FROM t2; 因为触发器,所以变成了2
1.8 CREATE和INDEX(索引)
官网文档:CREATE-INDEX
创建普通索引
普通索引:列中的值可以为空,可以重复。
创建表格
CREATE TABLE i1(id int,name char(10));
对i1表格的id列做索引,名字为i1idx
CREATE INDEX i1idx ON i1(id);
SHOW INDEXES FROM i1\G 查看表格全部索引和属性
这里的索引属性是B树索引的意思,mysql默认是B+树索引
Index_type: BTREE
创建唯一索引
唯一索引:列中的值不能相同,必须唯一值,但是可以为空
CREATE UNIQUE INDEX i1 ON i1(name); 创建唯一索引
SHOW INDEXES FROM i1\G
创建表格时指定索引
创建表格
CREATE TABLE i2(id int,name char(10),INDEX i2idx(id));
INDEX i2idx(id) 表示创建索引,名字叫i2idx,索引的字段是id
SHOW INDEXES FROM i2\G
创建复合索引(多个列做成一个索引)
CREATE TABLE test1(id int,name char(10),age int,extra varchar(20));
CREATE INDEX i1idname ON test1(id,name); 指定id,name做成复合索引i1idname
SHOW INDEXES FROM test1\G 查看列的索引名字都是一样
2、SHOW 语句
2.1 SHOW和DATABASES(全部数据库)
官网SHOW文档:SHOW
SHOW DATABASES; 查看全部数据库名字
2.2 SHOW和TABLES(数据库的全部表格)
use test1; 进入数据库
SHOW TABLES; 查看数据中的全部表格名字
2.3 SHOW和CREATE
查看创建数据库时的属性
SHOW CREATE DATABASE test1; 查看test1数据库创建时的字符集和排序规则等属性
查看创建表格时的属性
use test1; 进入数据库
SHOW CREATE TABLE student; 查看创建student表格时设置的字段属性和其他属性
2.5 SHOW和BINLOG
SHOW BINARY LOGS; 查看二进制日志的全部文件
SHOW BINLOG EVENTS IN 'binlog.000002'; 指定二进制文件名查看文件内容
2.5 SHOW和GRANT
查看账户权限
SHOW GRANTS FOR [email protected];
2.6 SHOW和其他
查看mysql进程
SHOW PROCESSLIST; 查看mysql进程
查看视图
use test2; 进入数据库
SHOW TABLE STATUS LIKE 't_view'\G 查看视图信息
这个Comment: VIEW 定义了这个表格为视图
查看自定义函数
SHOW FUNCTION STATUS\G 查看全部自定义函数
SHOW CREATE FUNCTION deleteT1\G; 查看指定自定义函数创建信息
查看存储过程
SHOW PROCEDURE STATUS\G; 查看全部存储过程
SHOW CREATE PROCEDURE PRt1; 查看指定的存储过程创建方式
查看触发器
SHOW TRIGGERS\G; 查看全部触发器
SHOW CREATE TRIGGER t1_insert\G; 查看指定触发器的创建方式
查看全部变量
SHOW VARIABLES\G
查看全部全局变量
SHOW GLOBAL VARIABLES\G
查看表格索引
SHOW INDEXES FROM i1\G 查看表格全部索引和属性
3、INSERT 语句(增加内容到表格)
官网文档:INSERT
use test1; 进入数据库
插入一条数据到student表格,前面指定字段(列),后面输入内容
INSERT student(id,name,age,gender)VALUES('1','aa','18','M');
*代表所有,表示查看表格所有内容,表格少量数据可以使用这个,大量不用使用,要不然可能会卡死
SELECT * FROM student;
插入多个数据,中间用逗号隔开
use test1; 进入数据库
INSERT student(id,name,age,gender)VALUES('2','bb','18','F'),('3','cc','17','M');
SELECT * FROM student;
4、DELETE 语句(删除表格内容)
官网文档:DELETE
增加qq这一行
use test1; 进入数据库
INSERT student(id,name,age,gender)VALUES('4','qq','18','M');
SELECT * FROM student;
删除qq这一行
DELETE FROM student WHERE id='4';
SELECT * FROM student;
清空表格,但是不删除表格内容
创建一个表格
use test1;
CREATE TABLE t1 (id int primary key auto_increment,name varchar(20));
INSERT t1(id,name)VALUES('1','AA');
INSERT t1(id,name)VALUES('2','BB');
SELECT * FROM t1;
清空表格,但是不删除表格
DELETE FROM t1;
SELECT * FROM t1; 可以看到数据不见了
SHOW TABLES; 可以看到表格还在
5、UPDATE (更改表格内容)
官网文档:UPDATE
use test1; 进入数据库
指定更新id为1的name字段内容
SET 指定数据更新的列和值,WHERE指定老的列和值
UPDATE student SET name='dd' WHERE id='1';
SELECT * FROM student;
UPDATE和USER(修改账户密码),这种只适合mysql 5.7以下版本修改密码
CREATE USER 'bb'@'localhost' IDENTIFIED BY 'Test12#$'; 创建账户
指定账户信息,通过修改表格方式修改密码
UPDATE mysql.user set password=password('BBbb12#$') where user='bb' AND host='localhost';
FLUSH PRIVILEGES; 指定表格方式修改密码需要刷新权限
exit
mysql -u bb -p'BBbb12#$' 测试登录
6、SELECT 语句(查询表格内容)
官网文档:SELECT
6.1 SELECT和WHERE
查询mysql数据库中user表的user,host字段(列)的内容
SELECT user,host FROM mysql.user;
指定条件查询字段内容
SELECT name,age FROM student WHERE age<=20;
6.2 SELECT和WHERE-AND/BETWEEN(指定范围)
指定范围查询内容,默认前后都包括
SELECT name,age FROM student WHERE age>=18 AND age<=20;
SELECT name,age FROM student WHERE age BETWEEN 18 AND 20;
6.3 SELECT和WHERE-IN(自定义查询范围)
SELECT name,age FROM student WHERE age in (17,18);
6.4 SELECT和WHERE-IS(查看空值和非空)
INSERT student(id,name,gender)VALUES('4','dd','M'); 插入一条包括空值数据
SELECT name,age FROM student WHERE age is null; 查看空值数据
SELECT name,age FROM student WHERE age is not null; 查看非空值数据
6.5 SELECT和WHERE-字段=值(指定固定值查询)
SELECT name,age FROM student WHERE age='18';
6.5 SELECT和WHERE-字段 LIKE 值%(模糊查询)
INSERT student(id,name,age,gender)VALUES('5','daa','19','M');
SELECT name,age FROM student WHERE name like 'd%';
6.6 SELECT和内置函数(count,avg,max,min)
SELECT count(id) FROM student; 统计字段出现有多少行
SELECT avg(age) FROM student; 统计字段的平均值
SELECT max(age) FROM student; 统计字段的最大值
SELECT min(age) FROM student; 统计字段的最小值
查看当前登录账户
SELECT CURRENT_USER(); 查看当前登录账户
6.7 SELECT和GROUP BY(分组查询)
指定age,统计age相同的人数
SELECT age 年龄,count(*) 数量 FROM student GROUP BY age;
age 年龄 后面的年龄是为了输出时显示,不会修改原本表格数据
count(*) 数量 count(*)内置函数,可以统计列的全部值
6.7 SELECT和ORDER(排序查询)
正序和倒序
表格创建时会带有排序规则,所以具体要看排序规则的方式排序,不一定都是按照从A-Z这种方式排序
SELECT * FROM student ORDER BY id; 默认是从小到大,正序排序
SELECT * FROM student ORDER BY id desc; 指定desc为倒序排序
指定固定行查询
SELECT * FROM student; 默认是以id排序
SELECT * FROM student ORDER BY id LIMIT 3; 指定以id排序,输出前3个
跳序查询
表格创建时会带有排序规则,所以具体要看排序规则的方式排序,不一定都是按照从A-Z这种方式排序
SELECT * FROM student ORDER BY age;
跳过前面3个,输出第4,5这2个
SELECT * FROM student ORDER BY age LIMIT 3,2;
6.8 SELECT和其他
查看mysql版本号
SELECT VERSION();
查看当前登录账户
SELECT CURRENT_USER();
查看当前所在数据库
SELECT DATABASE();
7、ALTER语句(主要修改数据库、表格、用户等属性)
7.1 ALTER和DATABASE(数据库)
官网文档:ALTER-DATABASE
修改数据库属性最好是空的数据库,要不然原本数据库的表格可能会发生乱码错误
SHOW CREATE DATABASE test2; 查看数据库创建时的字符集和排序规则等属性
ALTER DATABASE test2 character set gbk; 修改test2数据库的字符集
ALTER DATABASE test2 COLLATE=gbk_chinese_ci; 修改test2数据库的排序规则
SHOW CREATE DATABASE test2; 再次查看数据库属性
7.2 ALTER和TABLE(表格)
官网文档:ALTER-TABLE
修改表格字符集和排序规则
创建一个表格,新的表格的字符集和排序规则由创建表格的数据库的创建数据定义,也就是说表格的数据库的字符集和排序规则是什么,表格的属性就是什么。
use test3;
CREATE TABLE t1 (id int primary key auto_increment,name varchar(20));
INSERT t1(id,name)VALUES('1','AA');
INSERT t1(id,name)VALUES('2','BB');
SELECT * FROM t1;
SHOW CREATE TABLE t1; 查看表格属性
一般表格和数据库的字符集和排序规则一致,最好不要修改
ALTER TABLE t1 character set gbk; 修改t1表格字符集
ALTER TABLE t1 COLLATE=gbk_chinese_ci; 修改t1表格的排序规则
增加表格字段(列)
SELECT * FROM t1; 原本只有2个字段(列)id和name
指定在id后面增加新的列age
ALTER TABLE t1 add age int AFTER id;
SELECT * FROM t1;
删除字段(列)
SELECT * FROM t1; 查看原本表格字段
ALTER TABLE t1 DROP COLUMN age; 指定删除age字段
SELECT * FROM t1; 确认删除age字段
修改字段名字
指定将name字段修改为mingzi字段
注意:修改字段需要注意字段类型,要不然可能会出现乱码
ALTER TABLE t1 CHANGE COLUMN name mignzi char(12);
SELECT * FROM t1;
7.3 ALTER和USER(用户)
官网文档:ALTER-USER
创建账户
创建账户aa,设置密码和登录方式
CREATE USER 'aa'@'localhost' IDENTIFIED BY 'Test12#$';
mysql -u aa -p'Test12#$'
exit
修改用户密码
ALTER USER [email protected]'localhost' identified by 'AAaa12#$'; 修改[email protected]'localhost'的密码
mysql -u aa -p'Test12#$' 重新用老密码不能登录
mysql -u aa -p'AAaa12#$' 新密码可以登录
mysql 5.7以下老版本修改密码另外方式
SET PASSWORD FOR 'bb'@'localhost' = PASSWORD('Test12#$'); 修改密码
mysql -u bb -p'Test12#$' 重新登录,可以看到密码修改成功
修改当前登录账户密码
SELECT CURRENT_USER(); 查看当前登录账户
ALTER user user() identified by 'Test12#$'; 默认没有root权限不能修改别人密码,但是可以用这个命令修改自己密码
mysql -u aa -p'AAaa12#$' 老密码不能登录
mysql -u aa -p'Test12#$' 新密码可以,修改密码成功
锁定和解锁账户
ALTER USER 'aa'@'localhost' ACCOUNT LOCK; 锁定账户'aa'@'localhost'
ALTER USER 'aa'@'localhost' ACCOUNT UNLOCK; 解锁账户
修改账户密码插件
SELECT user,host,plugin FROM mysql.user; 查看老的账户信息
ALTER USER 'aa'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Test12#$'; 修改插件
SELECT user,host,plugin FROM mysql.user; 查看账户信息
7.4 ALTER和INDEX(索引)
对表格添加索引
CREATE TABLE A1(id int,name char(10)); 创建表格
ALTER TABLE A1 ADD INDEX a1idx(id); 对A1表格的字段id添加索引a1idx
SHOW INDEX FROM A1\G
删除表格索引
ALTER TABLE A1 DROP INDEX a1idx; 删除表格索引a1idx
SHOW INDEX FROM A1\G
7.5 ALTER和MODIFY(修改数据长度)
CREATE TABLE M1(id int,name char(10)); 创建表格,name字段长度为10
ALTER TABLE M1 MODIFY name char(15); 修改name字段长度为15
SHOW CREATE TABLE M1; 确认修改成功
7.6 ALTER和PRIMARY KEY(主键)
添加主键时,主键对应的列的数据不能为空,一个表只能有一个主键
CREATE TABLE Z1(id int,name char(10)); 创建表格
ALTER TABLE Z1 MODIFY id int NOT NULL; 设置主键不为空
ALTER TABLE Z1 ADD PRIMARY KEY (id); 创建主键
因为主键也是索引的一种,所以这样查看
SHOW INDEX FROM Z1; 查看表格主键信息
删除主键
ALTER TABLE Z1 DROP PRIMARY KEY; 删除主键,只有一个,不用指定字段名
SHOW INDEX FROM Z1; 查看表格主键信息
8、DROP 语句
8.1 DROP和DATABASE(数据库)
官网文档:DROP-DATABASE
DROP DATABASE test1; 删除数据库test1
8.2 DROP和TABLE(表格)
官网文档:DROP-TABLE
创建一个表格
use test2;
CREATE TABLE t2 (id int primary key auto_increment,name varchar(20));
INSERT t2(id,name)VALUES('1','AA');
INSERT t2(id,name)VALUES('2','BB');
SELECT * FROM t2;
SHOW TABLES;
删除表格
DROP TABLE t2;
SHOW TABLES; 可以看到表格已经被删除
8.3 DROP和USER(用户)
SELECT user,host,plugin FROM mysql.user; 查看全部账户
DROP USER [email protected]'localhost'; 删除指定账户
SELECT user,host,plugin FROM mysql.user; 再次查看
8.4 DROP和VIEW
use test2;
SHOW TABLE STATUS LIKE 't_view'\G 查看视图信息
通过这个Comment: VIEW 可以看到这个表格实际是视图,不是平常的表格
DROP VIEW t_view; 删除视图
8.5 DROP和其他
删除自定义函数
use test2;
DROP FUNCTION deleteT1; 删除自定义函数
删除存储过程
use test2;
SHOW CREATE PROCEDURE PRt1\G; 查看指定的存储过程创建方式
DROP PROCEDURE PRt1; 删除存储过程
删除触发器
SHOW CREATE TRIGGER t1_insert\G; 查看触发器
DROP TRIGGER t1_insert; 删除触发器
9、GRANT 授权语句
官网文档:GRANT
创建账户和数据库
创建t1账户
CREATE USER 't1'@'localhost' IDENTIFIED BY 'Test12#$';
CREATE DATABASE t1; 创建t1数据库
授权t1账户对t1数据库有所有权限
GRANT ALL ON t1.* TO [email protected]'localhost';
创建t2数据库
CREATE DATABASE t2;
授权t1账户对t2账户具有查询权限
GRANT SELECT ON t2.* TO [email protected]'localhost';
用root账户先在t2数据库创建表格
CREATE TABLE t2(id int,name char(10));
INSERT t2(id,name)VALUES('1','aa');
SELECT * FROM t2;
测试权限是否授权成功
查看t1账户对t1数据库的权限
mysql -u t1 -p'Test12#$' 用t1账户登录
use t1; 进入t1数据库
CREATE TABLE t1(id int,name char(10)); 创建表格
INSERT t1(id,name)VALUES('1','aa'); 插入数据到表格
SELECT * FROM t1; 查看表格数据
DROP TABLE t1; 删除表格
查看t1账户对t2数据库的权限
mysql -u t1 -p'Test12#$' 用t1账户登录t2数据库
CREATE TABLE t2(id int,name char(10)); 没有新建权限
INSERT t2(id,name)VALUES('2','bb'); 没有插入权限
SELECT * FROM t2; 只有查询权限
10、REVOKE 撤销(删除)权限语句
官网文档:REVOKE
REVOKE ALL PRIVILEGES,GRANT OPTION FROM [email protected]'localhost'; 撤销全部权限
SHOW GRANTS FOR [email protected]; 查看权限列表
这个是默认账户登录权限,必须要有才能使用账户
GRANT USAGE ON *.* TO `t1`@`localhost`
mysql -u t1 -p'Test12#$' 重新登录
use t1; 可以看到没有t1数据库的权限
撤销部分权限方式
GRANT ALL ON t1.* TO [email protected]'localhost'; 先授权t1账户对t1数据库有全部权限
SHOW GRANTS FOR [email protected]; 查看权限
REVOKE INSERT ON t1.* FROM [email protected]'localhost'; 撤销对t1数据库的插入权限
SHOW GRANTS FOR [email protected]; 查看权限
用t1账户登录,测试权限
mysql -u t1 -p'Test12#$' 登录
use t1; 进入数据库
CREATE TABLE t1(id int,name char(10)); 有新建权限
INSERT t1(id,name)VALUES('1','aa'); 没有插入权限
SELECT * FROM t1; 有查询权限
SHOW TABLES; 表格也有生成
11、SET语句
SET设置变量文档:SET
自定义临时变量
SET @var_t1=11; 设置变量@var_t1,值为11
SELECT @var_t1; 查看变量
mysql -u tt1 -p'Test12#$' 退出登录后,自定义变量不会保存到数据库
SELECT @var_t1; 因为没保存,所以值为空
系统变量
文档:SET-VARIABLE
Option File 这里的Yes表示这个内容是选项,需要去配置文件修改
System Var 这里的Yes表示这个内容是变量,可以直接在mysql客户端修改值
如果这2个都是Yes,代表可以在配置文件修改,也可以在mysql客户端修改值
查看默认系统字符集的变量
SELECT @@character_set_results;
set character_set_results="utf8mb3"; 当前终端修改默认字符集值,退出登录自动恢复
SELECT @@character_set_results;
全局变量(不会因为退出登录或重启而失效)
SHOW GLOBAL VARIABLES LIKE 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=OFF; 设置全局变量
SHOW GLOBAL VARIABLES LIKE 'log_bin_trust_function_creators';
12、EXPLAIN语句(一般用于查询索引是否执行)
官网文档:EXPLAIN
EXPLAIN输出内容文档:EXPLAIN-OUT
主要关注列:
type:表格的连接类型,通过这个判断索引是否被用到(从最优到最差):
- system:一般不会出现,只会出现在mysql的内置系统表中才会显示。
- const:一般需要只有一个匹配的行并且这行的其他值可以被mysql当为常量才能出现这种情况。如果索引是主键也会出现这个。
- eq_ref:一般出现在关联表查询过程中,并且当使用的索引是主键或唯一非 NULL 索引时, 才会出现这个。
- ref:一般查询时最优结果,出现这个类型,优化算是很好的了。如果是使用非唯一性索引情况下,就会出现这种结果。
- fulltext:使用FULLTEXT索引会出现这个。
- ref_or_null:在ref类型的情况下,另外搜索包括NULL值的行会出现这个。一般用于表格的子查询。
- index_merge:此连接类型表明使用了索引合并优化。在这种情况下,key输出行中的列包含所用索引的列表,并 key_len包含所用索引的最长键部分的列表。
- unique_subquery:此类型替换这种形式eq_ref的某些 IN子查询:value IN (SELECT primary_key FROM single_table WHERE some_expr)
- index_subquery:主要用于替换IN子查询语句,适用于这种形式的子查询中的非唯一索引。value IN (SELECT key_column FROM single_table WHERE some_expr)
- range:使用索引时,查询的语句指定范围则会出现这个。比如SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20;
- index:当Extra列还显示Using index时,证明这次查询只使用了索引表的索引,没有进行全表扫描。当Extra列没有Using index时,证明此次查询按照索引的顺序进行了全表扫描。
- ALL:最差的查询结果,表格会对每个行组合进行全表扫描。
possible_keys:可能使用到的索引,但是实际不一定使用到。为空则没有使用索引。
key:一定使用到的索引,为空则没有使用索引。
ref:(该ref列显示将哪些列或常量与列中指定的索引进行比较以 key从表中选择行。)
- const:常见结果,表示使用到了常见的索引类型。
- func:表示使用的值是某个函数的结果。
- NULL:一般没有使用到索引会出现这个
rows:此次查询扫描了多少行
Extra:(额外信息,通过这个对索引进一步优化)
具体看官网文档:EXPLAIN-Extra
注意:以下结果有时候会同时出现。
常见输出:
- Using index:使用了覆盖索引,最优结果
- Using index condition:使用条件加索引方式。比如已经知道了行的范围或内容,但是还是需要索引查找,如EXPLAIN SELECT * FROM tbl_name where id in (1,11);
- Using where:使用到了where语句,但是不一定使用到了索引,要和type配合查看。
- Using filesort:一般使用到了ORDER BY语句就会出现这个。
- Using index for group-by:一般使用GROUP BY语句出现这个。
- NULL:一般这个表示索引使用了,但是还可以优化,要和type配合查看。
ORDER BY语句和索引优化:索引-ORDER BY
GROUP BY语句和索引优化:索引-GROUP BY
创建表格和索引
CREATE TABLE e1(id int,name char(10)); 创建表格
CREATE INDEX e1idx ON e1(id); 创建索引
插入数据
INSERT e1(id,name)VALUES('1','aa'),('2','bb'),('11','aa1'),('12','bb1');
SELECT * FROM e1;
使用EXPLAIN查看使用索引和没有使用索引
EXPLAIN SELECT id FROM e1 WHERE id='1'; 使用了索引
可以看到type为ref,key为e1idx
EXPLAIN SELECT * FROM e1 WHERE id LIKE 'a%'; 没有使用到索引
可以看到type为ALL和key为NULL,通过rows为4行,也可以看出进行了全表扫描
Using where表示使用到了where语句,但是不一定使用到索引
查看Using index condition和Using filesort
EXPLAIN SELECT * FROM e1 WHERE id in (1,11); 使用了索引
type为range,key为e1idx证明使用到了索引,Using index condition表示使用了索引和条件
EXPLAIN SELECT * FROM e1 ORDER BY id;
type为NULL,key为NULL,Using filesort表示是一个ORDER BY语句
索引最优选择
EXPLAIN SELECT id,name FROM e1 WHERE id='1'; 使用了索引,但是不是最优
可以看到WHERE已经定义了只查找id为1的行,就不需要在写name了
EXPLAIN SELECT id FROM e1 WHERE id='1'; 最优使用索引方式
Extra同时出现不同结果
EXPLAIN SELECT id FROM e1 WHERE id in (1,11);
可以看到使用到了索引和wehere条件
13、DESCRIBE(简写DESC,主要用于查看表或视图结构)
create table student (id int unsigned primary key auto_increment,name varchar(10),age tinyint unsigned,gender enum('M','F') default 'M');
DESC student; 2种都可以查看表结构
DESCRIBE student;
因为视图相当于另外一种方式的表格,所以可以用DESC命令
CREATE VIEW t_view AS SELECT user,host,plugin FROM mysql.user; 创建视图
DESC t_view; 查看视图结构
14、RENAME语句
RENAME 修改账户名字
把账户名字从[email protected]'localhost' 改为[email protected]'localhost'
RENAME USER [email protected]'localhost' TO [email protected]'localhost';
SELECT user,host FROM mysql.user;
边栏推荐
- 【历史上的今天】6 月 12 日:美国进入数字化电视时代;Mozilla 的最初开发者出生;3Com 和美国机器人公司合并
- tarfile解压嵌套tar
- 232-ch579m learning and development Ethernet routine TCP server (project application package, LAN or WAN test)
- PHP converts total seconds to hours, minutes and seconds
- Voir les pages du site
- Delivery lead time lightweight estimation practice - Notes
- yoloe 目标检测使用笔记
- 六石认知学:大脑的显速与潜速
- How to download Vega in China
- Implementation of VGA protocol based on FPGA
猜你喜欢
Redis中的事务
Liunx deploy Seata (Nacos version)
美团获得小样本学习榜单FewCLUE第一!Prompt Learning+自训练实战
chrome浏览器解决跨域问题
WinCC7.5 SP1调整画面尺寸以适应显示分辨率的方法
【0008】无序列表
Kali2022 how to install w3af
Meituan won the first place in fewclue in the small sample learning list! Prompt learning+ self training practice
Shell 数组和函数
3GPP RAN第一次F2F会议,都干了些啥?
随机推荐
实验10 Bezier曲线生成-实验提高-交互式生成B样条曲线
leetcode:6096. Success logarithm of spells and potions [sort + dichotomy]
ThansmittableThreadLocal详解
Transactions in redis
How to break the black screen after cleaning the dust and applying silicone grease on the laptop?
no available service ‘null‘ found, please make sure registry config correct
On how to make digital transformation after the loan of large policy banks- Yixinhuachen
OpenGL shadow implementation (hard shadow)
liunx部署Seata(Nacos版)
Vue —— 进阶 vue-router 路由(二)(replace属性、编程式路由导航、缓存路由组件、路由的专属钩子)
Meituan won the first place in fewclue in the small sample learning list! Prompt learning+ self training practice
5G R17标准冻结,主要讲了些啥?
从应无所住说起
A journey of database full SQL analysis and audit system performance optimization
wireshark基本使用命令
leetcode:6096. 咒语和药水的成功对数【排序 + 二分】
吃饭咯 干锅肥肠 + 掌中宝!
OpenGL shadow implementation (soft shadow)
ISCC2022
Detailed explanation of yolox network structure