MySQL默认CHARSET和COLLATE选取原理

CHARSET和COLLATE是MySQL中用来指定字符编码和比较规则的关键字。
在建表语句中,可以使用这些关键字来定义表的字符类型的数据编码以及相应的字符比较规则。
编码和规则的差异会影响查询、排序等操作的结果。
在MySQL中,编码和规则之间存在一对多的关系。
它带有多种编码和规则组合。
相同编码下,不同的规则对应不同大小的比较结果,例如后缀为ci的规则会忽略字符串的大小写,而规则cs则会考虑大小写比较。
MySQL提供了多个级别设置COLLATE规则的能力,包括实例级别、库级别、表级别、列级别和SQL查询级别。
规则级别选择优先级为SQL查询设置>列级设置>表级设置>库级设置>实例级设置。
如果在实例级别设置了默认字符集和排序规则,但在创建表时指定了新的字符集,则新字符集和默认的MySQL内部排序规则最终将生效。
MySQL根据排序规则在内核代码中记录的顺序选择最新的排序规则。
当语法中只指定了未排序的字符集时,MySQL会在语法解析阶段识别这种情况,并通过get_charset_by_csname()函数检索对应的字符集和排序规则组合对象。
MySQL内部,字符集和顺序以元组的形式存在,实现字符编码和比较规则之间的一对多关系。
通过函数get_charset_by_csname()获取字符集数据代码逻辑可以发现,如果只指定字符集,而不指定顺序,MySQL不会使用高层的排序规则,而是会直接先使用内部字符规则列表中与目标字符集匹配的排序规则。
总之,CHARSET和COLLATE对于MySQL中设置字符数据的排序规则至关重要。
它们广泛应用于字符串数据的搜索和排序,影响DISTINCT查询、GROUPBY、HAVING等语句的结果。
通过设置不同的字符级别和比较规则,您可以灵活控制数据的处理方式。
如果只指定字符集而没有指定顺序,MySQL将自动在其内部注册表中选择第一个与指定字符集匹配的排序规则。

MYSQLEXPLAIN执行计划|京东物流技术团队

当MySQL中遇到慢查询时,执行计划(EXPLAIN)就显得尤为重要。
它揭示了优化器如何处理查询语句,包括表连接顺序、访问方式等,以优化查询性能。
使用EXPLAIN语句,我们可以深入了解SQL的执行路径,对瓶颈进行针对性的优化。
EXPLAIN可以让我们通过模拟优化器的行为来了解SQL是如何分解和执行的。
例如,对于SELECT语句,基本语法是在查询语句前添加EXPLAIN。
执行计划包含多个输出元素,如id(表示SELECT关键字的顺序和优先级)、select_type(查询类型,如PRIMARY、UNION等)、table(参与查询的表)、type(访问type(例如system、const等),每个都提供关键信息。
例如,当您连接到查询时,每个表对应于计划中的一条记录。
相同的ID表示连接顺序,而UNION和子查询将分别分配独立的ID。
执行计划中过滤的行和列分别表示预期扫描的行数和过滤的百分比。
Extra列提供额外的调整信息,例如是否使用索引或临时表。
理解这些概念有助于我们识别查询性能的瓶颈,并通过修改查询语句、优化索引结构或调整查询策略来提高数据查询的效率。
请记住,每个输出元素都是优化查询性能的线索,不应被忽视。