Mysql索引和MD5加密

448 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天

1.数据库级别的MD5加密

什么是MD5

主要增强算法复杂度不可逆性。

MD5不可逆,具体的MD5是一样的

MD5破解原理,背后有一个字典,MD5加密后的值,加密前的值

 CREATE TABLE `testmd5`(
     `id` INT(4) NOT NULL,
     `name` VARCHAR(20) NOT NULL,
     `pwd` VARCHAR(50) NOT NULL,
     PRIMARY KEY(`id`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 ​
 INSERT INTO testmd5 VALUES(1,'zhangsan','12345678'),(2,'lisi','1234567'),(3,'wnagwu','1234567')
 ​
 UPDATE testmd5 SET pwd=MD5(pwd) --加密全部密码
 ​
 ​
 INSERT INTO testmd5 VALUES(4,'xiaoming',MD5('123456'))
 ​
 ​
 SELECT  * FROM testmd5 WHERE `name` = 'xiaoming' AND pwd = MD5('123456')

2.索引

Msql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构

提取句子主干,就可以得到索引的本质:索引是数据结构。

2.1索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个

  • 主键索引(PRIMARY KEY)

    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引(UNIQUE KEY)

    • 避免重复的类出现,唯一索引可以重复,多个列都可以标识位 唯一索引
  • 常规索引(KEY/INDEX)

    • 默认的,index , key 关键字来设置
  • 全文索引(FULLTEXT)

    • 在特定的数据库引擎下才有,MylSAM
    • 快速定位数据
 -- 索引的使用
 -- 1.在创建表的时候给字段增加索引
 -- 2.创建完毕后,增加索引
 ​
 -- 显示所有的索引信息
 SHOW INDEX FROM 表
 ​
 -- 增加一个索引
 ALTER TABLEADD FULLTEXT INDEX 索引名(字段名)
 ​
 -- EXPLAIN 分析sql执行状况
 EXPLAIN SELECT * FROM student -- 非全文索引
 ​

2.2 测试索引

 CREATE TABLE `app_user` (
 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(50) DEFAULT '',
 `email` VARCHAR(50) NOT NULL,
 `phone` VARCHAR(20) DEFAULT '',
 `gender` TINYINT(4) UNSIGNED DEFAULT '0',
 `password` VARCHAR(100) NOT NULL DEFAULT '',
 `age` TINYINT(4) DEFAULT NULL,
 `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
 `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8
 ​
 -- 插入100万数据
 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`)
 VALUE(CONCAT('用户',i),'534240118@qq.com',FLOOR (CONCAT('18',RAND()*9999999)),FLOOR (RAND()*2),
 UUID(),FLOOR (RAND()*100));
 ​
 SET i = i+1;
 END WHILE;
 RETURN i;
 ​
 ​
 END;
 ​
 INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
 VALUE(CONCAT('用户',i),'534240118@qq.com',FLOOR (CONCAT('18',RAND()*9999999)),FLOOR (RAND()*2),
 UUID(),FLOOR (RAND()*100))
 ​
 ​
 SELECT mock_data();
 ​
 SELECT * FROM app_user WHERE `name`='用户9999' -- 接近半秒
 ​
 EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999'  -- 查询99999条记录
 ​
 -- id _ 表名_字段名
 -- create index on 字段
 CREATE INDEX id_app_user_name ON app_user(`name`); -- 0.001 s
 EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999'  -- 查询一条记录
 ​

索引在小数据的时候,用处不大,但是在大数据的时候,区别十分明显

2.3 索引原则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

索引的数据结构

Hash 类型的索引

Btree: 默认innodb 的数据结构

阅读: blog.codinglabs.org/articles/th…