(一)数据不能明文存储怎么办
1、简单Hash
- 以前,大多数网站保存的都是经过一次MD5哈希的密码。 哈希保存的思路很简单:用户注册时,把他的密码做一次MD5运算储存起来;用户登录时,把他输入的密码做一次MD5运算,再验证是否和数据库里储存的一致。不安全。
2、其他Hash
- 其他哈希方法:sha256等;应付不了彩虹表的攻击方式:彩虹表就是先尽可能把简单的数字密码组合的哈希计算出来,这些明文和哈希结果的对应关系就是一张彩虹表。可以破解绝大多数人的密码。
3、加盐Hash
- 目前业界最常见的做法是加盐哈希:保证了储存数据的不可逆,防止彩虹表的攻击
- 用户注册时,给他随机生成一段字符串,这段字符串就是盐(Salt)
- 把用户注册输入的密码和盐拼接在一起,叫做加盐密码
- 对加盐密码进行哈希,并把结果和盐都储存起来
- 在登陆时,先取出盐,再同样进行拼接、计算哈希,就能判断密码的合法性
(二)数据库与文件相比好处/数据库系统对比文件系统的优点
- 提高了数据的共享性,使多个用户能够同时访问数据库中的数据。
- 提高了数据的一致性和完整性。
- 提供数据与应用程序的独立性
- 比保存在文件系统中更安全
(三)联合索引
1、定义
- 复合索引(又称为联合索引),是在多个列上创建的索引。
2、 关键
- 创建复合索引最重要的是列顺序的选择,这关系到索引能否使用上,或者影响多少个谓词条件能使用上索引。
- 复合索引的使用遵循最左匹配原则,只有索引左边的列匹配到,后面的列才能继续匹配。
3、 最左前缀匹配原则
(1) 为什么
- 与联合索引的索引构建方式及存储结构有关系
- 首先我们创建的index_bcd(b,c,d)索引,相当于创建了(b)、(b、c)(b、c、d)三个索引,看完下面你就知道为什么相当于创建了三个索引。联合索引是首先使用多列索引的第一列构建的索引树,用上面idx_t1_bcd(b,c,d)的例子就是优先使用b列构建,当b列值相等时再以c列排序,若c列的值也相等则以d列排序。我们可以取出索引树的叶子节点
(2)怎么做
- mysql从左到右直到范围(> < like between)匹配就停止
(四)数据表每个字段都建索引会怎样
- 在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。
- 给数据表每个字段都建索引可能会让查询变快,但是,添加,删除和更新数据就会很麻烦。每添加一条新记录都要插入100个索引键,每删除一条记录也要删除100索引键,而且每个索引键都要先通过检索找到他的位置。更新一条记录也是一样,要先找到100个索引键的原始位置,再把它放到新的位置上。
(五)如何建立索引
- 选择唯一性索引
- 为经常需要排序、分组和联合操作的字段建立索引
- 为常作为查询条件的字段建立索引
- 限制索引的数目
- 尽量使用数据量少的索引
- 尽量使用前缀来索引
- 删除不再使用或者很少使用的索引
- 尽量选择区分度高的列作为索引
(六)给一条mysql语句,如何查询并且拿到返回数据
1、 MySQL 可以分为 Server 层和存储引擎层两部分。
- Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。(不同的存储引擎共用一个 Server 层,也就是从连接器到执行器的部分)
- 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
2、步骤
(1) 第一步
- 会先通过连接器连接到数据库上。连接器负责跟客户端建立连接、获取权限、维持和管理连接。
(2) 第二步
- 连接建立完成后,就可以执行 select 语句了。
- MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。
- 之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
- 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。
- 你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。
(3) 第三步
- 如果没有命中查询缓存,就要开始真正执行语句了。
- 首先,MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。
- 分析器先会做**“词法分析”**。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。- MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。
- 做完了这些识别以后,就要做**“语法分析”**。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。
(4) 第四步
- 经过了分析器,MySQL 就知道你要做什么了。
- 在开始执行之前,还要先经过优化器的处理。
- 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
(5) 第五步
- 优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。
- 开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。