INSERT INTO 表名(字段1,字段2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);
## 登录mysql的时候需要添加--local-infile参数
mysql --local-infile -u root -p
## 登录之后设置local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
## 使用load命令导入数据
load data local infile '文件' into table `表名` fields terminated by `文件里面的分隔符` lines terminated by '\n';
文件里面的内容格式如下
1,a,b,c
2,b,c,d
PS:主键顺序插入性能高于乱序插入
在InnoDB存储引擎中,表数据都是根据逐渐顺序组织存放的,这种存储方式的表成为索引组织表(index organized table IOT)
页可以为空 ,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果 一行数据多大,会溢出),根据主键排列。
当删除一条记录时,实际上记录并没有被物理删除,只是被标记(flaged)为啥暗处并且他的空间变得允许被其他记录声明使用。当页面中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并已优化空间使用。
通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。
通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率更高。
一般分页查询时,通过创建 覆盖索引 能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化。
InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行累加(主键不可能为null)。
没有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。
有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层们直接按行进行累加。
InnoDB疫情遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行累加。
InnoDB疫情并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。
优化方案
InnoDB的行锁是针对索引加的锁,不是针对记录家的锁,并且该索引不能失效,否则会从行锁升级为表锁。规避这种情况就需要在对应字段创建索引。
]]>类别 | 全称 | 概述 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行删增改查 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户,控制数据库的访问权限 |
SHOW DATABASES;
SELECT DATABASE();
CREATE DATABASE [ IF NOT EXISTS ] 数据库名称 [ DEFAULT CHARSET 字符集 ] [ COLLATE 排序规则 ];
使用时可以在数据库名称前面加入"IF NOT EXISTS",意为当数据库不存在则创建否则不作为。
DROP DATABASE [ IF EXISTS ] 数据库名称;
使用时可以在数据库名称前面加入"IF EXISTS",意为当数据库存在则删除否则不作为。
USE 数据库名称;
ps:表操作需要使用数据库之后才能操作
SHOW TABLES;
DESC 表名称;
SHOW CREATE TABLE 表名;
CREATE TABLE 表名(
字段1 字段1数据类型 [ COMMENT 字段1注释 ],
字段2 字段2数据类型 [ COMMENT 字段2注释 ],
字段3 字段3数据类型 [ COMMENT 字段3注释 ]
......
) [ COMMENT 表格注释 ];
修改表名称
ALTER TEABLE 表名 RENAME TO 新表名;
DROP TABLE [ IF EXISTS ] 表名;
"IF EXISTS" 意为有则删除否则不作为
TRUNCATE TABLE 表名;
ALTER TABLE 表名 ADD 字段名 类型(长度) [ COMMENT 注释 ] [约束];
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [ COMMENT 注释 ] [约束];
ALTER TABLE 表名 DROP 字段名
MYSQL的数据类型主要分为三种:数值类型、字符串类型、日期时间类型。
类型 | 大小 | 有符号范围(SIGNED) | 无符号范围(UNSIGNED) | 概述 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 byte | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3 byte | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT或INTEGER | 4 byte | (-8388608,8388607) | (0,4294967295) | 大整数值 |
BIGINT | 8 byte | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 |
FLOAT | 4 byte | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8 byte | (-1.7976931348623157E+308,1.7976931348623157E+308) | 0 和(2.2250738585072014E-308,1.7976931348623157E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
类型 | 大小 | 概述 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes 极 | 极大文本数据 |
类型 | 大小 | 范围 | 格式 | 概述 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至9999-12-31 23:59:59 | YYYY-MM-DDHH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至2038-01-19 03:14:07 | YYYY-MM-DDHH:MM:SS | 混合日期和时间值,时间戳 |
INSERT INTO 表名(字段1,字段2,......) VALUES (值1,值2,......);
INSERT INTO 表名 VALUES (值1,值2,......);
INSERT INTO 表名(字段1,字段2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);
INSERT INTO 表名 VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);
UPDATE 表名 SET 字段1=值1,字段2=值2,...... [ WHERE 条件 ]
DELETE FROM 表名 [ WHERE 条件 ]
修改删除数据的时候,如果不加where判断条件则调整的整张表的内容。
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
SELECT 字段1,字段2,.... FROM 表名;
SELECT * FRIN 表名;
SELECT 字段1 [ AS '别名' ],字段2 [ AS '别名2' ] FROM 表名;
输出的时候字段名称会 替换成别名,这段SQL中的AS可以不写,例如
SELECT 字段 '别名' FROM 表名;
SELECT distinct 字段列表 FROM 表名;
SELECT 字段列表 FROM 表名 WHERE 条件列表;
运算符 | 功能 |
---|---|
> | 大于 |
\>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在某个范围之内(含最小,最大值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意多个字符) |
IS NULL | 是NULL |
运算符 | 功能 | ||
---|---|---|---|
AND 或 && | 并且(多个条件同时成立) | ||
OR 或 \ | \ | 或者(多个条件任意一个成立) | |
NOT 或 ! | 非,不是 |
SELECT 聚合函数(字段) FROM 表名;
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ]
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2,排序方式2
ASC:升序(默认)
DESC:降序
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
DQL的执行顺序为FROM 表 > WHERE 条件查询 > GROUP BY 分组查询 > SELECT 字段查询 > ORDER BY 排序查询 > LIMIT 分页查询
USE mysql;
SELECT * FROM user;
CREATE USER `用户名`@`主机名` IDENTIFIED BY `密码`;
ALTER USER `用户名`@`主机名` IDENTIFIED WITH mysql_native_password BY `新密码`;
DROP USER `用户名`@`主机名`;
常用权限如下表
权限 | 说明 |
---|---|
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 数据查询 |
INSERT | 插入数据 |
UPDATE | 更新数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库、表、试图 |
CREATE | 创建数据库、表 |
这是常用的 其他的可以去官网查看
SHOW GRANTS FOR `用户名`@`主机名`;
GRANT 权限列表 ON 数据库名.表名 TO `用户名`@`主机名`;
REVOKE 权限列表 ON 数据库名.表名 FROM `用户名`@`主机名`;
]]>