MySQL常用操作(一)

本文介绍了在MySQL中创建用户表的语句,包括字段定义和约束。对比了两种不同的插入数据方法,指出批量插入能减少网络开销。讨论了UNION查询的用法和去重特性,以及LIMIT在分页查询中的作用。此外,还提到了EXPLAIN分析SQL执行计划的重要性,以及如何通过存储过程高效插入大量数据。优化查询方面,建议利用索引避免全表扫描和filesort操作。
摘要由CSDN通过智能技术生成

创建表

create table user(
	id int unsigned primary key not null auto_increment,
	name varchar(50) unique not null,
	age tinyint not null,
	sex enum('M', 'W') not null
)engine=INNODB default charset=utf8;

# 查看创建表语句
show create table user

两种插入方式比较

# 方式1
insert into user(name, age, sex) values('zhangsan', 21, 'M');
insert into user(name, age, sex) values('lisi', 22, 'M');
insert into user(name, age, sex) values('xiaohong', 21, 'W');
insert into user(name, age, sex) values('wangwu', 22, 'M');
insert into user(name, age, sex) values('zhaoliu', 23, 'M');

# 方式2
insert into user(name, age, sex) values('zhangsan', 21, 'M'),('lisi', 22, 'M'),('xiaohong', 21, 'W'),('wangwu', 22, 'M'),('zhaoliu', 23, 'M');

方式1五次insert就要5次的TCP握手和挥手,而方式2只要一次TCP握手和挥手

例子:union合并查询

SELECT expression1, expression2, ... expression_n
FROM tables[WHERE conditions]
UNION [ALL | DISTINCT] # 注意:union默认去重,不用修饰distinct,all表示显示所有重复值
SELECT expression1, expression2, ... expression_n
FROM tables[WHERE conditions];

如:

select name,age,sex from user where age >= 22 union all select name,age,sex from user where sex='M';

注:or 也可用到索引

limit分页查询

从第1行开始(第0行是起始行),查找出3行数据:

select * from user limit 1, 3;

explain可以查看SQL语句的执行计划:
首先表内容为:

在这里插入图片描述

查看执行计划:

explain select * from user where age = 20;

在这里插入图片描述

可以看出来age这一列没有建立索引,需要逐行查找。

而对于name列有建立索引,虽然记录不在第一行但是只需要查找一次:

在这里插入图片描述

例子:使用存储过程往表中插入大量记录

这个例子可以用于进行一些测试工作中提前需要有大量记录的表

# 将结束符设置为 $
delimiter $
create Procedure add_t_user(IN n INT)
BEGIN
DECLARE i INT;
SET i=0;

WHILE i<n DO
insert into t_user values(null,concat(i+1, '@qq.com'),i+1);
SET i=i+1;
END WHILE;
END$
# 将结束符修改回 ;
delimiter;
call add_t_user(2000000);

limit能够优化查询效率

limit在没有索引的时候查找到指定的记录就停止,如果不加limit就要全表扫描。

在这里插入图片描述

例子:
设每页行数pagenum=20, pageno为页号,显示某一页的数据:

select * from user limit (pageno-1)*pagenum, pageno * pagenum

但是这个select效率太低,偏移量( (pageno-1)*pagenum )大的时候需要花时间,可以通过使用:

select * from user where id>上一页最后一条数据的id值 limit 20;

这条语句能够利用id索引省去偏移的时间开销。

order by排序

发现order by查询的Extra列是 Using filesort 说明使用到了归并排序(外排序)可以性能优化,如加索引或者修改查询列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值