MySQL/数据库 知识点总结( 二 )


详细内容可以参考: MySQL字符集及校对规则的理解
索引MySQL索引使用的数据结构主要有BTree索引 和 哈希索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引 。
MySQL的BTree索引使用的是B树中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的 。

  • MyISAM: B+Tree叶节点的data域存放的是数据记录的地址 。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录 。这被称为“非聚簇索引” 。
  • InnoDB: 其数据文件本身就是索引文件 。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录 。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引 。这被称为“聚簇索引(或聚集索引)” 。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方 。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引 。因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂 。PS:整理自《Java工程师修炼之道》
更多关于索引的内容可以查看文档首页MySQL目录下关于索引的详细总结 。
查询缓存的使用执行查询语句的时候,会先查询缓存 。不过,MySQL 8.0 版本后移除,因为这个功能不太实用
my.cnf加入以下配置,重启MySQL开启查询缓存
query_cache_type=1query_cache_size=600000MySQL执行以下命令也可以开启查询缓存
set globalquery_cache_type=1;set globalquery_cache_size=600000;如上,开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果 。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息 。因此任何两个查询在任何字符上的不同都会导致缓存不命中 。此外,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表,其查询结果也不会被缓存 。
缓存建立之后,MySQL的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效 。
缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁 。因此,开启缓存查询要谨慎,尤其对于写密集的应用来说更是如此 。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十MB比较合适 。此外,还可以通过sql_cache和sql_no_cache来控制某个查询语句是否需要缓存:
select sql_no_cache count(*) from usr;什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行 。
事务最经典也经常被拿出来说例子就是转账了 。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元 。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了 。事务就是保证这两个关键操作要么都成功,要么都要失败 。
事物的四大特性(ACID)
MySQL/数据库 知识点总结

文章插图
 
  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割 。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性(Durability): 一个事务被提交之后 。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响 。
并发事务带来哪些问题?在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作) 。并发虽然是必须的,但可能会导致以下的问题 。


推荐阅读