13 MYSQL 索引选择
MySQL 如何选择索引
1. 优化器逻辑
选择索引是优化器的工作。而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。优化器会考虑扫描行数、是否使用临时表、是否排序等因素进行综合判断。对于普通索引来说,优化器需要把回表的代价算进去。
MySQL 如何选择索引
选择索引是优化器的工作。而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。优化器会考虑扫描行数、是否使用临时表、是否排序等因素进行综合判断。对于普通索引来说,优化器需要把回表的代价算进去。
MySQL 中怎么做问题追踪与性能优化
mysql 中有以下几种问题排查的工具:
show processlistshow engine innodb statusinformation_schema.innodb_trxshow engine innodb statusoptimizer_traceperformance_schema 和 sys 系统库接下来我们以下面的实现环境看看,如何使用这些工具排查 MySQL 的性能问题
对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
我们用下面两张表作为我们测试 SQL 用法的试验环境:
|
|
类似下面的 SQL,对索引字段做了函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
random 存在哪些问题
从一个单词表中随机选出三个单词。这个表的建表语句和初始数据的命令如下:
|
|
select word from words order by rand() limit 3; 这个语句的意思很直白,但执行流程却有点复杂的。
MySQL 里面的几种自增 id,它们的值达到上限以后,会出现什么情况。
表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。因此就会出现主键冲突错误。
insert select 为什么有这么多锁?
本节我们会介绍一些特殊的 insert 语句产生的锁:
|
|
在可重复读隔离级别下,binlog_format=statement 时, insert into t2(c,d) select c,d from t; 需要对表 t 的所有行和间隙加锁。原因还是日志和数据的一致性。