MySQL高级特性(二)
字符集和校对
字符集是指一种从二进制编码到某类字符符号的映射,校对是指一组用于某个字符集的排序规则.
MySQL如何使用字符集
每种字符集都可能有多种校对规则,并且都有一个默认的校对规则,每个校对规则都是针对某个特定的字符集的,和其他的字符集没有关系,校对规则和字符集总是一起使用的,所以也将这样的一个组合统称为一个字符集.
创建对象时的默认设置
MySQL服务器有默认字符集,每个数据库也有默认值,每个表也有默认值,这是一个逐层继承的默认设置,最终最靠底层的默认设置将影响创建的这个对象
- 创建数据库的时候,将根据服务器上的character_set_server 设置来设定该数据库的默认字符集
- 创建表的时候,将根据数据库的字符集来设置指定这个表的字符集设置
- 创建列的时候,将根据表的设置指定列的字符集设置
最终起作用的还是最靠近底层的设置.
服务器与客户端通信时的设置
当服务器和客户端通信的时候,它们可能使用不同的字符集,这时,服务器端将进行必要的翻译转换工作.
- 服务器端总是假设客户端是按照character_set_client 设置的字符来传输数据和SQL语句的
- 当服务器收到客户端的SQL语句时,先将其转换为字符集character_set_connection .它还使用这个设置来决定如何将数据转换成字符串
- 当服务器端返回数据或者错误信息给客户端时,会将其转换为character_set_result.
全文索引
通过数值比较,范围过滤等就可以完成绝大多数查询,但是如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较,全文索引就是为这种场景设计的.
全文索引有自己独特的语法,没有索引也可以工作,如果有索引效率会更高,用于全文搜索的索引有着独特的结构,帮助这类查询找到匹配某些关键字的记录
全文索引可以支持各种字符内容的搜索,也支持自然语言搜索和布尔搜索.
分布式(XA)事务
存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID 可以扩展到数据库层面,甚至可以扩展到多个数据库之间,
分布式事务中需要有一个事务协调器来保证所有的事务参与者都完成了准备工作,如果协调器收到所有的参与者都准备好的消息,就会告诉所有的事务可以提交了,这是第二阶段,MySQL在这个分布式事务过程中扮演一个参与者的角色,而不是协调者.
MySQL有两种XA 事务,一方面,MySQL可以参与到外部的分布式事务中,另一方面,还可以通过分布式事务来协调存储引擎和二进制日志.
查询缓存
很多数据库产品都可以缓存查询的执行计划, 对于相同类型的SQL就可以跳过SQL解析和执行计划生成阶段,MySQL在某些场景下页可以实现,但是MySQL还有另一种不同的缓存类型 缓存完整的SELECT 查询结果,也就是查询缓存.
MySQL查询缓存 保存查询返回的完整结果,当查询命中该缓存,MySQL会立刻返回结果,跳过了解析,优化,和执行阶段.
查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有缓存数据都将失效,虽然看起来这样实现效率很低,但是这种实现代价小,
查询缓存对应用程序是完全透明的,应用程序无需关心MySQL是通过查询缓存返回的结果还是实际执行返回的结果,
随着现在通用服务器越来越强大,查询缓存被发现是一个影响服务器扩展性的因素,它可能成为整个服务器的资源竞争点,在多核服务器上还可能导致服务器僵死,所以很多时候应该默认关闭查询缓存
MySQL如何判断缓存命中
MySQL判断缓存命中的方法很简单,缓存存放在一个引用表中,通过一个哈希值引用,哈希值包括了查询本身,当前要查询的数据库,客户端协议的版本等一些其他可能会影响返回结果的信息.当判断缓存是否命中时,MySQL不会解析,正则化或者参数化查询语句,而是直接使用SQL语句和客户端发送过来的原始信息,任何字符的不同都会导致缓存不命中.
如果希望有更高的缓存效率,可以选择memcached等.
Author: corn1ng
Link: https://corn1ng.github.io/2017/12/22/老板MYSQL/MySQL高级特性(二)/
License: 知识共享署名-非商业性使用 4.0 国际许可协议