Open wsafight opened 1 year ago
学习 MySQL 数据库是笔者今年的首要任务。在这篇文章中我将使用问答的形式来讲述目前学习到的知识点。
对比其他数据库,MySQL 是特殊的。它支持多种存储引擎。InnoDB 是 MySQL 的默认存储引擎,当前的优化都是基于此引擎。
InnoDB 既可以将数据持久化的放到磁盘中,又可以在内存中处理数据。在数据库运行的过程中,数据引擎不断的在磁盘和内存中进行交互。在交互的过程中为了提升性能,将数据划分为许多页(避免一条一条交互)。InnoDB 存储引擎一页默认的大小为 16KB(通过 innodb_page_size 修改)。也就是说,一次至少从磁盘中读取 16KB 的数据到内存中,即使当前只读取了页中的某一条数据。同时一次也会把 16KB 的数据写入磁盘中。
可以简单的理解,数据库页中存储了多条记录。而这些页以双向链表的形式链接。目前如果需要查询数据的话,我们得从第一页中检索数据直到最后一页。这是不可接受的,这时候就得依靠树结构来优化查询了。
[数据项 1 - 100] <=> [数据项 101 - 198] <=> [数据项 302 - 400]
首先,我们目前的数据页是没有顺序的,我们先考虑先加一个数据项,这里先叫做 id。这时候我们可以在页中添加当前页数据的最大值以及最小值。
[1,100 数据项 1 - 100] <=> [101,198 数据项 101 - 198] <=> [302,400 数据项 302 - 400]
接下来我们开始构建树,构建一个多级目录。
[1,1 101,2 392,3 ]
[页 1 1,100 数据项 1 - 100] <=> [页2 101,198 数据项 101 - 198] <=> [页3 302,400 数据项 302 - 400]
假定一页能存储 100 条数据记录,以及 200 条索引记录。那么 4 层结构就是 200 200 200 * 100 条数据。
此时我们查询就变成二分查找到第二层,依次进行了 4 次二分查找,耗时很短。
此时就是聚簇索引:以主键的大小作为记录的规则排序,在叶子节点储存表中所有的列。
事实上,InnoDB 会为所有没有主键的表建立,如果超过了 2 的 48 次方后就会清零,所以我们需要为每一个表建立主键。不可靠远比不可用更危险。
如果我们是以主键作为查询条件,我
针对二级索引,我们是需要先去查一次索引,然后再去回表。但实际上,我们如果只需要查询索引和主键的话,我们就可以不用回表了。
也就是说我们
条件字段函数操作
隐式类型转换
学习 MySQL 数据库是笔者今年的首要任务。在这篇文章中我将使用问答的形式来讲述目前学习到的知识点。
数据库存储
对比其他数据库,MySQL 是特殊的。它支持多种存储引擎。InnoDB 是 MySQL 的默认存储引擎,当前的优化都是基于此引擎。
InnoDB 是如何存储的数据的?
InnoDB 既可以将数据持久化的放到磁盘中,又可以在内存中处理数据。在数据库运行的过程中,数据引擎不断的在磁盘和内存中进行交互。在交互的过程中为了提升性能,将数据划分为许多页(避免一条一条交互)。InnoDB 存储引擎一页默认的大小为 16KB(通过 innodb_page_size 修改)。也就是说,一次至少从磁盘中读取 16KB 的数据到内存中,即使当前只读取了页中的某一条数据。同时一次也会把 16KB 的数据写入磁盘中。
可以简单的理解,数据库页中存储了多条记录。而这些页以双向链表的形式链接。目前如果需要查询数据的话,我们得从第一页中检索数据直到最后一页。这是不可接受的,这时候就得依靠树结构来优化查询了。
[数据项 1 - 100] <=> [数据项 101 - 198] <=> [数据项 302 - 400]
数据表为什么要建立主键?为什么要自增呢?
首先,我们目前的数据页是没有顺序的,我们先考虑先加一个数据项,这里先叫做 id。这时候我们可以在页中添加当前页数据的最大值以及最小值。
[1,100 数据项 1 - 100] <=> [101,198 数据项 101 - 198] <=> [302,400 数据项 302 - 400]
接下来我们开始构建树,构建一个多级目录。
[1,1 101,2 392,3 ]
[页 1 1,100 数据项 1 - 100] <=> [页2 101,198 数据项 101 - 198] <=> [页3 302,400 数据项 302 - 400]
假定一页能存储 100 条数据记录,以及 200 条索引记录。那么 4 层结构就是 200 200 200 * 100 条数据。
此时我们查询就变成二分查找到第二层,依次进行了 4 次二分查找,耗时很短。
此时就是聚簇索引:以主键的大小作为记录的规则排序,在叶子节点储存表中所有的列。
事实上,InnoDB 会为所有没有主键的表建立,如果超过了 2 的 48 次方后就会清零,所以我们需要为每一个表建立主键。不可靠远比不可用更危险。
索引是如何能够优化查询的?
如果我们是以主键作为查询条件,我
索引优化
什么是覆盖索引?有什么作用?
针对二级索引,我们是需要先去查一次索引,然后再去回表。但实际上,我们如果只需要查询索引和主键的话,我们就可以不用回表了。
也就是说我们
有什么不好的查询吗?
条件字段函数操作
隐式类型转换
什么是前缀索引?有什么作用?
什么是唯一索引?有什么作用?
什么是索引合并?有什么作用?
什么是组合索引?有什么作用?
使用 in 会影响索引吗?数量呢?