MySQL优化班13期课后作业,20180731

a. 什么是回表,回表一定就不好吗,为什么

b. MySQL 8.0开始支持直方图功能了,这种情况下,还需要留着索引吗,为什么
已邀请:

xiehanwu

赞同来自:

1、回表应该是通过索引查询之后,利用索引的键值回到表中检索其他列的值;回表未必是坏事,例如查询的列不只是索引列时,还有其他的数据列,这时候是需要回表的;
2、直方图是对一个表的列的数据的分布统计,有利于mysql选择更好的执行计划,尤其是找不到索引的情况下,不过,这并不能代替索引的作用。

aaron8219 - Oracle DBA

赞同来自:

a. 什么是回表,回表一定就不好吗,为什么?
答:回表就是无法通过索引去检索所需获取的数据(参考不满足覆盖索引的情况),那么一般就是先通过辅助索引找到主键值,然后再回表找到SQL语句中涉及到的字段,最后返回结果集。
我认为凡事无绝对,任何结论与现象通常都与各种环境场景互相依存,只能说通常情况下,不回表就可以通过索引快速返回数据,减少物理读和逻辑读
至于何种场景回表比较好,我想到的一种情况是,当我们的结果集需要索引全扫描的时候,而这个索引又比较庞大(如:好几个很长的字符串字段创建的联合索引),那么这个时候回表可能性能更好一些(比方说只查询某个表中的两个字段,这两个字段也没有包含在其他联合索引中,并且其中只有其中一个字段上有单列索引,这样是不能走覆盖索引的,需要回表)。

b. MySQL 8.0开始支持直方图功能了,这种情况下,还需要留着索引吗,为什么?
答:MySQL直方图的作用应该和Oracle的功能是一致的,就是可以在数据倾斜比较严重的列上收集到更准确的统计信息,减少优化器错误判断执行计划成本的发生概率
而索引也是作为优化器生成执行计划时所能参考的一项重要部分,它会判断走索引成本低还是全表成本低(通常都是前者低);亦或同样是走索引,也需要判断走哪个索引成本更低,生成更优的执行计划
从作用上来说,两者是相辅相成的,都是为优化器服务,获取更好地执行计划,没有说谁可以替代谁的功能,所以说即便是有直方图的功能,索引也是万万不可去除的。
 

gjw1987b

赞同来自:

a. 什么是回表,回表一定就不好吗,为什么
mysql是索引组织表,通过二级索引检索到对应的主键值,然后再通过主键值查询到数据行 这种行为叫做回表
回表不一定不好,比如字符列太宽,用了前缀索引,为了检索到真实的全部宽度的字符需要回表。索引中不包含查询列时也需要回表。特别宽的字段不适合包含在索引中,此时回表性能可能更好。

b. MySQL 8.0开始支持直方图功能了,这种情况下,还需要留着索引吗,为什么?
需要保留索引。索引跟直方图的功能不一样。
直方图记录了数据的分布情况,便于优化器针对复杂数据分布情况选择更加合适的执行计划,比如是选择全表扫描还是选择索引扫描,具体选择哪个索引等等。
索引的功能主要是减少数据访问量,减少IO,索引也会极大减少innodb存储引擎的锁的范围,提高并发度,在没有索引的情况下,rr隔离级别时update一行记录会升级为表锁。

gjw1987b

赞同来自:

还有个问题想请教下,mysql 5.7中没有直方图,一个表有203w条记录,表结构如下:
mysql> show create table EMP;
+-------+-----------------------------------------------------------
| Table | Create Table                                                                                                                                        | EMP   | CREATE TABLE `EMP` (
  `EMPLOYEE_ID` int(11) NOT NULL AUTO_INCREMENT,
  `FIRST_NAME` varchar(20) DEFAULT NULL,
  `LAST_NAME` varchar(25) DEFAULT NULL,
  `EMAIL` varchar(25) DEFAULT NULL,
  `PHONE_NUMBER` varchar(20) DEFAULT NULL,
  `HIRE_DATE` date DEFAULT NULL,
  `JOB_ID` varchar(10) DEFAULT NULL,
  `SALARY` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`EMPLOYEE_ID`),
  KEY `inx_salary` (`SALARY`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 |
+-------+--------------------------------------------------------------
其中 1-100w条记录salary依次是1——100w的整数,101w-103w条记录salary是1000w,104w-203w记录一次是1000w—1100w的整数,查询salary >100w and salary <1000w 的记录时优化器是怎么评估出有三条记录?
mysql> desc select * from EMP where salary>1000000 and salary<10000001;
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | EMP   | NULL       | range | inx_salary    | inx_salary | 6       | NULL |    3 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+

查询了select * from innodb_table_stats where table_name='EMP';
mysql> select * from innodb_index_stats where index_name='inx_salary';
没发现怎么评估出这个条件有3条记录

k2865 - A793-文彦章-成都

赞同来自:

a. 什么是回表,回表一定就不好吗,为什么
回表是查询时没法只走索引就可以查询数据而到表里去查询的情况,大多情况下回表是更低的效率,除非索引构建得很不好,还没有回表的效率高.
b. MySQL 8.0开始支持直方图功能了,这种情况下,还需要留着索引吗,为什么
真不懂...不过看黎明兄的懂一些了..也就是论坛作业的意义吧.

liyh

赞同来自:

直方图是啥

要回复问题请先登录注册