1.索引分类 1.主键索引 (primary key) 唯一标识,主键不可重复,只能有一个列作为主键
2.唯一索引 (unique key) 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引
3.常规索引(key/index) 默认的,index,key关键字来设置
4.全文索引(fullText) 在特定的数据库引擎下才有,mylsam 快速定位数据
5.基础语法
2.建表测试
CREATE TABLE app_user
(
id
bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name
varchar(50) DEFAULT '' COMMENT '用户昵称',
email
varchar(50) NOT NULL COMMENT '用户邮箱',
phone
varchar(20) DEFAULT '' COMMENT '手机号',
gender
tinyint(4) unsigned DEFAULT '0' COMMENT '性别(0:男;1:女)',
password
varchar(100) NOT NULL COMMENT '密码',
age
tinyint(4) DEFAULT '0' COMMENT '年龄',
create_time
datetime DEFAULT CURRENT_TIMESTAMP,
update_time
timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'
1
2
3
4
5
6
7
8
9
10
11
12
批量插入数据:100w
DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
INSERT INTO app_user(name
, email
, phone
, gender
, password
, age
)
VALUES(CONCAT('用户', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
索引效率测试
无索引
SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时 SELECT * FROM app_user WHERE name = '用户9999'; SELECT * FROM app_user WHERE name = '用户9999';
mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: app_user partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 992759 filtered: 10.00 Extra: Using where 1 row in set, 1 warning (0.00 sec)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 创建索引
CREATE INDEX idx_app_user_name ON app_user(name); 1 测试普通索引
mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: app_user partitions: NULL type: ref possible_keys: idx_app_user_name key: idx_app_user_name key_len: 203 ref: const rows: 1 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
mysql> SELECT * FROM app_user WHERE name = '用户9999'; 1 row in set (0.00 sec)
mysql> SELECT * FROM app_user WHERE name = '用户9999'; 1 row in set (0.00 sec)
mysql> SELECT * FROM app_user WHERE name = '用户9999'; 1 row in set (0.00 sec)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 3.索引准则 索引不是越多越好
不要对经常变动的数据加索引
小数据量的表建议不要加索引
索引一般应加在查找条件的字段
约束 1.外键概念 外键:给关联字段创建关联就是添加外键,简单来说外键就是被约束条件
切记:作为外键一定要和关联主键的数据类型保持一致
–记录老师的数据表
CREATE TABLE Teachers(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR (20),
age INT,
gender boolean
);
–给老师添加数据
INSERT INTO Teachers (name,age,gender) VALUES (“Lily”,12,0),
(“Linta”,14,0),
(“Zahi”,22,0),
(“Paul”,20,1),
(“Jeans”,21,1);
–创建学生的表
CREATE TABLE Students(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
Teacher_id TINYINT,
FOREIGN KEY (Teacher_id) REFERENCES Teachers(id)
)ENGINE=INNODB;
–给学生添加数据
INSERT INTO Students (name,Teacher_id) VALUES (“ViewIn1”,2),
(“ViewIn2”,4),
(“ViewIn3”,1),
(“ViewIn4”,3),
(“ViewIn5”,2),
(“ViewIn6”,3),
(“ViewIn7”,2),
(“ViewIn8”,4);
以上就是给Students的Teacher_id绑定外键为Teachers的id,这样就能将每一个学生与老师对应起来
2.关联约束 其中,Teacher是母表,Students是子表,无法单独删除母表中的字段,因为被子表约束了
要删除母表中的字段,必须将该字段的约束解除,即子表的外键不再对应该字段
因此可以选择修改作为外键的数据,来删除母表的某字段
比如要删除字段1,将Students中id=4和id=6(原本对应母表id=3)的Teacher_id值设置为4
—>这样子表中就没有与母表id=3的字段有关联了
update Students set Teacher_id=4 where id=4 or id=6;
—>之后再删除母表id=3的字段就不受影响了
delete from Teachers where id=3;
—>此时插入一个学生,绑定外键为3就会报错
INSERT INTO Students (name,Teacher_id) values (“ZaHuw”,3);
3.添加与删除外键 给现成的表加外键
例:给Students创建一个外键,取名为aaa,外键字段为Teacher_id,将该外键关联到表Teachers的id字段
ALTER TABLE Students ADD CONSTRAINT aaa
FOREIGN KEY(Teacher_id)
REFERENCES Teachers(id);
2)删除已有的外键
ALTER TABLE Students drop foreign key aaa;
4.集联删除 设置集联删除:这样就不会被限制删除了;
如果删除了外键的字段,那它对应的外键也会跟着被删除;
如果删除了母表的字段,它对应的子表字段也会跟着被删除。
CREATE TABLE Students3(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
Teacher_id TINYINT,
FOREIGN KEY (Teacher_id) REFERENCES Teachers(id) on DELETE CASCADE
)ENGINE=INNODB;