今天的内容:
1.建库 建表
2.介绍 增删改
3.索引 Btree+
第1章 建表语句
1.建表语句
SQL语句:
2.引擎
InnoDB 默认新的引擎
MyISAM mysql系统库用的是他
3.主键
PRIMARY KEY
每个表都必须包含一个主键列
主键特性:
唯一 不能重复
非空
自增
3.字符集
默认 latin1
常用 UTF8
推荐 utf8mb4 emoji
4.字段类型
数字类型:
整数:
tinyint 1字节 = 8位 = 00000000 - 11111111 = 2^8个 = 0 - 255 , -127-128
int 4字节 = 32位 = 2^32个 = 0 - 2^32-1 ,-2^31-2^31-1 ,10位数
bigint 8字节 0 - 2^64-1 ,-2^63-2^63-1 ,20位数
浮点数:
decimal(m,n)
字符串类型:
char(N) :
N字符个数,最大不超过255
定长的字符串类型。
例如: char(10) ,最多存10个字符,只要10个字符以内,都10个字符长度的存储空间。剩余用空格填充。
varchar(M) :
M字符个数,最大不超过65535
变长的字符串类型。会额外占用1-2字节存储字符长度。255字符之内,额外1字节,255以上,额外2字节
例如: varchar(10),最多存10个字符,按需分配存储空间。
abc 3 =4
asdasdadasd 1000 =1002
5.建表语句
CREATE TABLE `school`.`linux`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` CHAR(10) NOT NULL COMMENT '姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
`ssex` ENUM('F','M','Y') NOT NULL DEFAULT 'Y' COMMENT '性别',
`address` VARCHAR(20) NOT NULL COMMENT '地址',
PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8mb4;
第2章 插入语句
第一种写法:
INSERT INTO `school`.`linux` (`id`, `name`, `age`, `ssex`, `address`)
VALUES ('1', '张亚', '29', 'M', '深圳南山区');
第二种写法:
INSERT INTO `school`.`linux`
VALUES ('1', '张亚', '29', 'M', '深圳南山区');
第三种写法:
INSERT INTO `school`.`linux` (`name`, `age`, `ssex`, `address`)
VALUES ('张亚', '29', 'M', '深圳南山区');
第3章 修改语句
1.修改表名-不要用
RENAME TABLE `school`.`linux` TO `school`.`linux7`;
2.修改列名-不要用
改列名:
ALTER TABLE `school`.`linux`
CHANGE `ssex` `sex`
ENUM('F','M','Y')
CHARSET utf8mb4
COLLATE utf8mb4_general_ci
DEFAULT 'Y'
NOT NULL
COMMENT '性别';
3.修改表数据-不要用
注意!!!修改表数据一定要加上限定条件!!!注意
UPDATE `school`.`linux7` SET `name` = '张亚男' WHERE `id` = '29';
4.增加字段
ALTER TABLE `school`.`linux7` ADD COLUMN `status`
ENUM('1','0') NOT NULL COMMENT '删除状态'
AFTER `address`;
第4章 删除语句-不要用
1.删数据
注意!!!删除表数据一定要加上限定条件!!!注意
DELETE FROM `school`.`linux7` WHERE `id` = '29';
2.伪删除
第一步: 增加一个状态字段
ALTER TABLE `school`.`linux7` ADD COLUMN `status`
ENUM('1','0') NOT NULL COMMENT '删除状态,0删除,1存在'
AFTER `address`;
第二步: 改造业务的查询语句
SELECT * FROM linux7 WHERE STATUS = '1';
第三步: 改造业务的删除逻辑-将删除替换为更新
UPDATE `school`.`linux7` SET `status` = '1' WHERE `id` = '1';
3.删字段-不要会
ALTER TABLE `school`.`linux7` DROP COLUMN `status`;
4.删表-不要会
DROP TABLE `school`.`linux7`;
5.删库-没教过
DROP DATABASE `school`;
第5章 索引
1.什么叫索引
假如表是一本书,索引就是这本书的目录
数据库索引的目的就是为了更快的找到我们要的数据
2.平衡树
BTREE
B+TREE
B++TREE
3.前提
1)如果表中设置了主键(例如ID列),自动根据ID列生成索引树。
2)如果没有设置主键,自动选择第一个唯一键的列作为聚簇索引
3)自动生成隐藏的聚簇索引。
4.构建过程
1)叶子节点: 存储数据行时就是有序的,直接将数据行的page作为叶子节点(相邻的叶子结点,有双向指针)
2)枝节点: 提取叶子节点ID的范围+指针,构建枝节点(相邻枝节点,有双向指针)
3)根节点: 提取枝节点的ID的范围+指针,构建根节点
5.查询语句
查询的语句条件为id列这样是最快的,因为这样直接就可以根据索引很快查到数据存储的位置
第6章 辅助索引
1.条件
需要人为创建辅助索引,将经常作为查询条件的列创建辅助索引,起到加速查询的效果。
2.功能
按照辅助索引列,作为查询条件时。
1.查找辅助索引树,得到ID值
2.拿着ID值回表(聚簇索引)查询
3.辅助索引生成过程
1.叶子节点:提取主键(ID)+辅助索引列,按照辅助索引列进行从小到大排序后,生成叶子节点。(相邻的叶子结点,有双向指针)
2.枝节点 :提取叶子节点辅助索引列的范围+指针,构建枝节点(相邻枝节点,有双向指针)
3.根节点 :提取枝节点的辅助索引列的范围+指针,构建根节点
第7章 索引应用
1.压测
mysql -uroot -padmin < t100w.sql
mysqlslap \
--defaults-file=/etc/my.cnf \
--concurrency=100 \
--iterations=1 \
--create-schema='test' \
--query="select * from test.t100w where k2='780P'" \
engine=innodb \
--number-of-queries=2000 \
-uroot -p123 \
-verbose -S /tmp/mysql_3306.sock
mysqlslap \
--defaults-file=/etc/my.cnf \
--concurrency=100 \
--iterations=1 \
--create-schema='test' \
--query="select * from test.t100w where id='780P'" \
engine=innodb \
--number-of-queries=200 \
-uroot -padmin \
-verbose -S /tmp/mysql_3306.sock
2.查看索引
desc t100w;
show index from t100w;
3.创建辅助索引
select * from test.t100w where k2='780P'
alter table t100w add index idx_k2(k2);