前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【最佳实践】巡检项:云原生数据库 TDSQL-C MySQL 版全表扫描数量

【最佳实践】巡检项:云原生数据库 TDSQL-C MySQL 版全表扫描数量

原创
作者头像
于航
修改2022-04-28 17:33:53
8640
修改2022-04-28 17:33:53
举报
文章被收录于专栏:腾讯云顾问

问题描述

在数据库中,对无索引的表进行查询或者有索引但是MySQL查询优化器不选择使用索引而进行的查询被称为全表扫描。如何判断当前某个

对语句执行EXPLAIN命令,如果Type列显示的结果为“ALL”,则说明MySQL 本次执行使用了全表扫描。

代码语言:javascript
复制
mysql> explain select * from servers;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | servers | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
1 row in set (0.03 sec)

这通常发生在以下情况下:

  1. 表的行数太少,MySQL优化器认为全表扫描一遍比使用索引更高效,一般发生在少于 10 行且行长度较短的表。
  2. 在where或者on子句上涉及到的字段,没有可用的索引。
  3. 通过索引字段与常数值进行条件匹配,MySQL优化器基于索引计算出扫描的记录数太多,超过全表记录的30%,优化器认为全表扫描性能将比走索引更好。
  4. 在一个区分度不好的字段上建索引,比如性别,查询男性或者女性,即使在性别字段上建索引,优化器认为走索引性能并不如全表扫描好。

对于记录数比较小的表,全表扫描并不会对性能产生太大的影响,有时候反而会提高性能。但是随着数据量的增加,全表扫描会越来越慢,因此应当尽可能的避免全表扫描。

解决方案

MySQL如何避免全表扫描
  1. 在where条件或者join的连接字段上添加合适的索引,大多数全表扫描是由于忘了加索引导致
  2. ANALYZE TABLE tbl_name,更新索引分布统计信息,帮助优化器更准确地评估执行成本,产生更优的执行计划。
  3. FORCE INDEX,让MySQL优化器强制走某个索引。
  4. 设置参数--max-seeks-for-key=1000 或者 SET max_seeks_for_key=1000,这个值设置的越小,MySQL优化器越倾向于走索引,而不是全表扫描。

参考文章:https://dev.mysql.com/doc/refman/5.7/en/table-scan-avoidance.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 解决方案
相关产品与服务
云顾问
云顾问(Tencent Cloud Smart Advisor)是一款提供可视化云架构IDE和多个ITOM领域垂直应用的云上治理平台,以“一个平台,多个应用”为产品理念,依托腾讯云海量运维专家经验,助您打造卓越架构,实现便捷、灵活的一站式云上治理。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档