来自 新葡亰数据库 2019-11-12 13:32 的文章
当前位置: 澳门新葡亰app > 新葡亰数据库 > 正文

select * 比select column快超级多意外案例解析

遇到MYSQL傻傻的地方,下面给个案例,大家感受下:

原文地址:传智播客_SQL入门作者:happylonger

 注意以下两个sql只有select *和select g.id区别。

SQL

SQL1:
SELECT
g.id
FROM
table1 g
INNER JOIN table2 l ON concat('订单号:',CONVERT(g.id,char)) = l.info
WHERE LOCATE('付款操作',l.info) AND g.p = 2
LIMIT 100

* 数据定义语言 DDL
* 数据操作语言 DML

查询时间:5.28s

* 查询和更新指令构成了 SQL 的 DML 部分:
 * SELECT - 从数据库表中获取数据
 * UPDATE - 更新数据库表中的数据
 * DELETE - 从数据库表中删除数据
 * INSERT INTO - 向数据库表中插入数据

SQL2:
SELECT
*
FROM
table1 g
INNER JOIN table2 l ON concat('订单设为付款操作成功 订单号:',CONVERT(g.id,char)) = l.info
WHERE LOCATE('付款操作成功',l.info) AND g.p = 2
LIMIT 100

* SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

查询时间:0.21s

* SQL 中最重要的 DDL 语句:
 * CREATE DATABASE - 创建新数据库
 * ALTER DATABASE - 修改数据库
 * CREATE TABLE - 创建新表
 * ALTER TABLE - 变更(改变)数据库表
 * DROP TABLE - 删除表
 * CREATE INDEX - 创建索引(搜索键)
 * DROP INDEX - 删除索引

注意以下Sending data的sql1比sql2慢,这是不是很诡异!!!!!!!!!!!!!!

* 在结果集(result-set)中导航
 由 SQL 查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。

SQL1:

* SQL TOP子句
 * SQL Server语法
  SELECT TOP number|percent column_name(s)
  FROM table_name
 * MySQL 语法
  SELECT column_name(s)
  FROM table_name
  LIMIT number
 * Oracle 语法
  SELECT column_name(s)
  FROM table_name
  WHERE ROWNUM <= number

 澳门新葡亰官网APP 1

* SQL JOIN
 * INNER JOIN: 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
 * JOIN: 如果表中有至少一个匹配,则返回行
 * LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
 * RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
 * FULL JOIN: 只要其中一个表中存在匹配,就返回行
 注: INNER JOIN 与 JOIN 是相同的。
* SQL UNION
 * UNION
 * UNION ALL

SQL2:

* SQL Select into

澳门新葡亰官网APP 2

* SQL 约束 (Constraints)
 * NOT NULL
 * UNIQUE
 * PRIMARY KEY
 * FOREIGN KEY
 * CHECK
 * DEFAULT

 

 * SQL FOREIGN KEY 约束
  * 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY
  * FOREIGN KEY 约束用于预防破坏表之间连接的动作。
  *FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

分析下profile的情况:

* SQL 函数
 * 函数的语法:
  SELECT function(列) FROM 表
* SQL GROUP BY 语句
 * GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
* SQL HAVING 子句
 * 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

sql1的Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out 比sql2的高很多,按理说字段少,处理数据更快啊!这里为什么反而更慢?????

数据库:保存在硬盘上的文件
数据库产品:采用一种优良的数据结构来保存数据,方便我们对数据进行查询和修改

Context_voluntary :这个是主动上下文切换次数

访问本机的mysql
 * mysql -?
 * mysql -hlocalhost -P3306 -uroot -proot
 * mysql -uroot -proot -b(取消警告音)

Context_involuntary :这个是被动上下文切换次数

sql语句,用于操作数据库的语句

Block_ops_in :这个是阻塞输入操作

数据库database 表table
创建create
查看show
修改alter
删除drop

Block_ops_out :这个是阻塞输出操作

所有对数据库和表单的操作 就是上面六个单词的组合

 

//创建一个数据库
create database mudb;

下面说下原因为什么select column比select *慢:

//删除一张表
drop table mytable;

1.select column比select *处理的数据少

澳门新葡亰app,一、数据库的操作
创建一个名称为mydb1的数据库
create database mydb1;

2.mysql的select操作使用的是悲观锁

创建一个使用utf-8字符集的mydb2数据库。
create database mydb2 character set utf8;

3.cpu对select column的处理速度要快于select *

创建一个使用utf-8字符集,并带校对规则的mydb3数据库。
create database mydb98 character set utf8 collate utf8_general_ci;

4.导致cpu处理完一批数据,ops_in 跟不上,而使用悲观锁,cpu不会自旋,等待数据,而是切换到其它任务

查看所有的数据库
show databases;
查看数据库的创建语句
show create database mydb2;

5.所以数据量少的上下文切换的更频繁

删除前面创建的mydb3数据库
drop database mydb3;
drop database if exists mydb3; 如果存在才会删除

6.所以select * 比select column快了很多

 数据库的修改
 数据库一旦创建名称无法修改 ,字符集和校对规则可以改
把mydb2的字符集修改为gb2312
alter database mydb2 character set gb2312;

 

备份数据库
//使用数据库
use mydb2;
澳门新葡亰官网APP,//创建表
create table a(
 name varchar(20)
);
//插入数据
insert into a(name) values('aaa');
insert into a(name) values('bbb');

解决办法:

备份数据库
mysqldump -uroot -proot mydb2 > d:/a.sql

多加几个字段,增加数据量,这样cpu就没有等待,进行的上下文切换就会少很多,速度就会快很多。如果应用嫌获得数据太多,应用层获得数据把这些数据进行过滤掉就行了。最好的办法是拆分字段,使查询走索引。

删除mydb2
drop database mydb2;

SELECT
g.id,g.column1,g.cloumn2
FROM
table1 g
INNER JOIN table2 l ON concat('订单号:',CONVERT(g.id,char)) = l.info
WHERE LOCATE('付款操作',l.info) AND g.p = 2
LIMIT 100

恢复数据库 实际上是恢复数据库中的数据
创建数据库 使用数据库
create database mydb3;
uer mydb3;
source d:/a.sql;

实际上source命令用于执行一段sql脚本

二、表的操作
创建表
Id  整形
name  字符型
gender  字符型或bit型
birthday 日期型
Entry_date 日期型
job  字符型
Salary  小数型
resume  大文本型

create table employee(
 id int,
 name varchar(20),
 gender varchar(6), --男 女 male female
 birthday date,
 entry_date date,
 job varchar(20),
 salary float,
 resume text
);

修改表
在上面员工表的基本上增加一个image列。
alter table employee add image blob;
修改job列,使其长度为60。
alter table employee modify job varchar(60);
删除gender列。
alter table employee drop gender;
表名改为user。
rename table employee to users;
修改表的字符集为utf-8
alter table users character set utf8;
列名name修改为username
alter table users change column name username varchar(40);

查看表所有的表
show tables;
查看表的创建语句
show create table users;
查看表的结构
desc users;

//删除表
drop table employee;

三、表中数据的操作(重点)
crud:create read update delete

sql语句
1.insert语句 增加数据
employee.sql
create table employee(
 id int,
 name varchar(20),
 gender varchar(6),
 birthday date,
 entry_date date,
 job varchar(20),
 salary float,
 resume text
);
插入三条记录
insert employee(id,name,gender,birthday,entry_date,job,salary,resume) values(1,'zhangsan','male','1989-1-1','2012-1-1','A',5000,'good boy');
insert employee(id,name,gender,birthday,entry_date,job,salary,resume) values(2,'lisi','male','1989-1-1','2012-1-1','A',5000,'good boy');
insert employee(id,name,gender,birthday,entry_date,job,salary,resume) values(3,'zhangsan','female','1989-1-1','2012-1-1','A',5000,'good girl');

insert employee(id,name,gender,birthday,entry_date,job,salary,resume) values(3,'王五','female','1989-1-1','2012-1-1','A',5000,'一个好男孩');

//查看数据库的所有编码
show variables like 'character%';
character_set_client 使用的客户端编码
character_set_results 结果集的编码

设置的方式
character_set_client=gbk;
character_set_results=gbk;

//创建一张a表
create table a(
 id int,
 name varchar(20)
);
insert into a values(1,'aaa');

insert into a(name) values('bbb');

insert a values(2,'ccc'),(3,'ddd');

规范的方式书写
insert into a(id,name) values(6,'eee');

查看表中的数据
select * from employee;

2.update语句 更新数据

3.delete语句 删除数据
truncate 删除表再创建表
truncate employee;

4.select语句 删除数据

 

本文由澳门新葡亰app发布于新葡亰数据库,转载请注明出处:select * 比select column快超级多意外案例解析

关键词: