下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库常见的索引问题有哪些?

作者:课课家教育     来源: http://www.kokojia.com点击数:1077发布时间: 2019-09-09 16:31:24

标签: 数据库数据管理数据结构

详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明。数据库系统的萌芽出现于二十世纪60 年代。当时计算机开始广泛地应用于 数据管理,对数据的共享提出了越来越高的要求。

传统的文件系统已经不能满足人们的需要,能够统一管理和共享数据的数据库管理系统( DBMS)应运而生。 数据模型是 数据库系统的核心和基础,各种DBMS 软件都是基于某种数据模型的。所以通常也按照 数据模型的特点将 传统数据库系统分成 网状数据库、层次数据库和 关系数据库三类。

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

数据库常见的索引问题有哪些_数据库_数据管理_数据结构_课课家

概述

在这些年的工作之中,由于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字段上添加索引是非常有效的。

添加索引

  1. mysql> alter table user add index ind_mo(mo); 
  2. mysql>SELECT uid FROM `userWHERE mo=13772556391 LIMIT 0,1; 

执行计划:

隐式转换

表结构:

执行计划:

  1. mysql> explain extended select uid from`userwhere mo=13772556391 limit 0,1; 
  2. mysql> show warnings; 
  3. Warning1:Cannot use index 'ind_mo' due to type or collation conversion on field 'mo'  
  4. Note:select `user`.`uid` AS `uid` from `userwhere (`user`.`mo` = 13772556391) limit 0,1 

如何解决:

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

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

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

总结

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

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

使用 计算机后,随着数据处理量的增长,产生了数据管理技术。数据管理技术的发展与计算机硬件(主要是外部存储器)系统软件及计算机应用的范围有着密切的联系。数据管理技术的发展经历了以下四个阶段:人工管理阶段、文件系统阶段、数据库阶段和高级数据库技术阶段。

赞(17)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程