概述

在这些年的工作之中,由于SQL问题导致的数据库故障层出不穷,而索引问题是SQL问题中出现频率最高的,常见的索引问题包括:无索引,隐式转换。

索引问题

1、无索引

当数据库中出现访问表的SQL无索引导致全表扫描,如果表的数据量很大,扫描大量的数据,应用请求变慢占用数据库连接,连接堆积很快达到数据库的最大连接数设置,新的应用请求将会被拒绝导致故障发生。

2、隐式转换

隐式转换是指SQL查询条件中的传入值与对应字段的数据定义不一致导致索引无法使用。常见隐士转换如字段的表结构定义为字符类型,但SQL传入值为数字;或者是字段定义collation为区分大小写,在多表关联的场景下,其表的关联字段大小写敏感定义各不相同。隐式转换会导致索引无法使用,进而出现上述慢SQL堆积数据库连接数跑满的情况。

无索引实例

表结构:

执行计划:

从上面的SQL看到执行计划中ALL,代表了这条SQL执行计划是全表扫描,每次执行需要扫描707250行数据,这是非常消耗性能的,该如何进行优化?添加索引。

验证mo字段的过滤性:

可以看到mo字段的过滤性是非常高的,进一步验证可以通过select count(*) as all_count,count(distinct mo) as distinct_cnt from user,通对比 all_count和distinct_cnt这两个值进行对比,如果all_cnt和distinct_cnt相差甚多,则在mo字段上添加索引是非常有效的。

添加索引

mysql>altertableuseraddindexind_mo(mo);

mysql>SELECTuidFROM`user`WHEREmo=13772556391 LIMIT 0,1;

执行计划:

隐式转换

表结构:

执行计划:

mysql> explain extendedselectuidfrom`user`wheremo=13772556391 limit 0,1;

mysql> show warnings;

Warning1:Cannot use index'ind_mo'duetotypeorcollation conversiononfield'mo'

Note:select`user`.`uid`AS`uid`from`user`where(`user`.`mo` = 13772556391) limit 0,1

如何解决:

上述案例中由于表结构定义mo字段后字符串数据类型,而应用传入的则是数字,进而导致了隐式转换,索引无法使用,所以有两种方案:

第一,将表结构mo修改为数字数据类型。

第二,修改应用将应用中传入的字符类型改为数据类型。

总结

在使用索引时,我们可以通过explain+extended查看SQL的执行计划,判断是否使用了索引以及发生了隐式转换。

由于常见的隐式转换是由字段数据类型以及collation定义不当导致,因此我们在设计开发阶段,要避免数据库字段定义,避免出现隐式转换。

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

mysql数据库隐式表_详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明...相关推荐

  1. mysql如何进行压测_详解MySQL如何按表创建千万级的压测数据

    有时我们要对系统做压测,或者数据库压力测试,这时候需要对某些表插入几百万或者上千万数据,下面介绍下怎么利用MySQL循环和存储过程对特定表的创建千万行数据. 1. 准备测试表 CREATE TABLE ...

  2. mysql如何查看事务日记_详解 Mysql 事务和Mysql 日志

    事务特性 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节. 2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破 ...

  3. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  4. mysql影响行数解析_详解MySQL的数据行和行溢出机制

    一.行 有哪些格式? 你可以像下面这样看一下你的mysql行格式设置. 其实mysql的数据行有两种格式,一种就是图中的 compact格式,还有一种是redundant格式. compact是一种紧 ...

  5. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SEL ...

  6. mysql查询男生基本情况_详解MySql基本查询、连接查询、子查询、正则表达查询...

    select * from STUDENT; 2.2.按条件查询 (1) 比较运算符 > , < ,= , != (< >),>= , <= select * fr ...

  7. mysql执行事务的语句_详解MySQL执行事务的语法和流程

    摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...

  8. mysql外键约束案例_详解MySQL中的外键约束问题

    使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程 .理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务 ...

  9. mysql 添加外键 完整_详解mysql添加外键的方法

    本文主要向大家介绍了mysql添加外键的方法,通过具体的实例让大家了解,希望对大家学习mysql有所帮助. 为已经添加好的数据表添加外键: 语法:alter table 表名 add constrai ...

最新文章

  1. Tensorflow 源码安装成功,导入报错 ImportError: cannot import name 'build_info'
  2. show index mysql_MySQL SHOW INDEX 语法解析
  3. 分享Kali Linux 2016.2第49周镜像文件
  4. 牛客-乃爱与城市拥挤程度【树形dp】
  5. 【设计模式 05】工厂方法模式
  6. 大数据之-Hadoop3.x_Yarn_资源调度器介绍说明---大数据之hadoop3.x工作笔记0140
  7. Linux之bash脚本编程---if补充和for循环
  8. SQL Server 轻松解决令你头疼的sa登录
  9. 排序类问题度量指标:Recall , MAP,MRR
  10. 【LeetCode】168. Excel Sheet Column Title 解题小结
  11. iphone 相机拍摄比例_在iPhone上拍摄:Apple如何解决Deepfakes和其他媒体操纵问题
  12. web player php,unity web player是什么软件
  13. 清除桌面多余的右键菜单
  14. 一文帮你深度了解Axie Infinity-啊蟹(内含细致教程)
  15. IP-Guard十六个模块功能详解
  16. 自媒体都在用的5个素材网站,视频、音效、图片全部免费下载~
  17. /sys/class/gpio 操作方法
  18. SpringBoot网页预览或下载pdf、图片
  19. 理解数据库中候选码,主码,外码,主属性,非主属性!
  20. 通过XtraBackup进行数据库表备份和表空间传输实例

热门文章

  1. 中美专利对比:2015年中国上升 美国首降
  2. 百度地图的简单使用 ——html js
  3. android启动第三方应用
  4. Sublime注释插件--DocBlockr
  5. 自主研发:3通道1GS/s FPGA+DSP板
  6. 选择DataGrid中的CheckBox控件后该行背景变色
  7. 微信攻城三国怎么找服务器,攻城三国怎么玩 新手FAQ常见问题答案汇总[图]
  8. 无盘服务器2个dhcp,无盘 dhcp 服务器配置
  9. 233网校java_java辅导:使用java模拟登陆考试大
  10. 综合论文训练2021年评审意见