mysql是怎么工作的 mysql是怎样运行的( 三 )


2.4 隐式类型转化
隐式类型转化主要原因是,表结构中指定的数据类型与传入的数据类型不同,导致索引无法使用 。所以有两种方案:
修改表结构,修改字段数据类型 。
修改应用,将应用中传入的字符类型改为与表结构相同类型 。
3. 为什么会选错索引3.1 优化器选择索引是优化器的工作 , 其目的是找到一个最优的执行方案 , 用最小的代价去执行语句 。在数据库中,扫描行数是影响执行代价的因素之一 。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少 。当然 , 扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表、是否排序等因素进行综合判断 。
3.2 扫描行数
MySQL 在真正开始执行语句之前,并不能精确的知道满足这个条件的记录有多少条,只能通过索引的区分度来判断 。显然,一个索引上不同的值越多,索引的区分度就越好,而一个索引上不同值的个数我们称为“基数” , 也就是说,这个基数越大,索引的区分度越好 。
MySQL 使用采样统计方法来估算基数:采样统计的时候 , InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值 , 得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数 。而数据表是会持续更新的,索引统计信息也不会固定不变 。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计 。
在 MySQL 中,有两种存储索引统计的方式,可以通过设置参数 innodb_stats_persistent 的值来选择:
on 表示统计信息会持久化存储 。默认 N = 20 , M = 10 。
off 表示统计信息只存储在内存中 。默认 N = 8,M = 16 。
由于是采样统计,所以不管 N 是 20 还是 8,这个基数都很容易不准确 。所以,冤有头债有主 , MySQL 选错索引,还得归咎到没能准确地判断出扫描行数 。
可以用 来重新统计索引信息,进行修正 。
3.3 索引选择异常和处理1. 采用 force index 强行选择一个索引 。2. 可以考虑修改语句,引导 MySQL 使用我们期望的索引 。3. 有些场景下,可以新建一个更合适的索引 , 来提供给优化器做选择,或删掉误用的索引 。
【mysql是怎么工作的 mysql是怎样运行的】mysql是怎么工作的的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql是怎样运行的、mysql是怎么工作的的信息别忘了在本站进行查找喔 。

推荐阅读