龙空技术网

mysql基础总结(十)

coder人生 169

前言:

此刻咱们对“mysqlforce”可能比较关切,咱们都想要知道一些“mysqlforce”的相关内容。那么小编在网摘上汇集了一些有关“mysqlforce””的相关知识,希望咱们能喜欢,我们快快来学习一下吧!

1.唯一索引和普通索引哪个性能更好?

a.对于查询操作来说:普通索引和唯一索引的性能相近,都是从索引树中进行查询;

b.对于更新操作来说:唯一索引要比普通索引执行的慢,因为唯一索引需要先将数据读取到内存中,再在内存中进行数据的唯一效验,所以执行起来要比普通索引更慢。

2.优化器选择查询索引的影响因素有哪些?

优化器的目的是使用最小的代价选择最优的执行方案,影响优化器选择索引的因素如下:

a.扫描行数,扫描的行数越少,执行代价就越少,执行效率就会越高;

b.是否使用了临时表;

c.是否排序。

3.MySQL 是如何判断索引扫描行数的多少?

MySQL 的扫描行数是通过索引统计列(cardinality)大致得到并且判断的,而索引统计列(cardinality)可以通过查询命令 show index 得到,索引扫描行数的多少就是通过这个值进行判断的。

4.MySQL 是如何得到索引基数的?它准确吗?

MySQL 的索引基数并不准确,因为 MySQL 的索引基数是通过采样统计得到的,比如 InnoDb 默认会有 N 个数据页,采样统计会统计这些页面上的不同值得到一个平均值,然后除以这个索引的页面数就得到了这个索引基数。

5.MySQL 如何指定查询的索引?

在 MySQL 中可以使用 force index 强行选择一个索引,具体查询语句如下:

select * from t force index(index_t)

6.在 MySQL 中指定了查询索引,为什么没有生效?

我们知道在 MySQL 中使用 force index 可以指定查询的索引,但并不是一定会生效,原因是 MySQL 会根据优化器自己选择索引,如果 force index 指定的索引出现在候选索引上,这个时候 MySQL 不会在判断扫描的行数的多少直接使用指定的索引,如果没在候选索引中,即使 force index 指定了索引也是不会生效的。

7.以下 or 查询有什么问题吗?该如何优化?

select * from t where num=10 or num=20;

答:如果使用 or 查询会使 MySQL 放弃索引而全表扫描,可以改为:

select * from t where num=10 union select * from t where num=20;

8.以下查询要如何优化?

表中包含索引:

KEY mid (mid)KEY begintime (begintime)KEY dg (day,group)

使用以下 SQL 进行查询:

select f from t where day='2010-12-31' and group=18 and begintime<'2019-12-31 12:14:28' order by begintime limit 1;

答:此查询理论上是使用 dg 索引效率更高,通过 explain 可以对比查询扫描次数。由于使用了 order by begintime 则使查询放弃了 dg 索引,而使用 begintime 索引,从侧面印证 order by 关键字会影响查询使用索引,这时可以使查询强制使用索引,改为以下SQL:

select f from t use index(dg) where day='2010-12-31' and group=18 and begintime< '2019-12-31 12:14:28' order by begintime limit 1;

标签: #mysqlforce