在数据库中合理的使用索引是提升mysql数据库的一种高效和快捷的方式,但是在索引的使用上在我的使用中发现有很多坑,因为自己之前没有认识到,所以来总结一下


索引的介绍

索引是一种特殊的文件,其中包含着对数据表中的所有记录的引用指针

添加索引的条件

  1. 字段中存储的内容重复性不能过高,比如性别,颜色等这些可区分性很低的字段

  2. 字段会经常性的用作查询语句。 因为创建索引也是需要存储的空间的,而且创建了索引会造成insert等语句的速度变慢

  3. 字段更新的斌率不高的字段适合添加索引。数据的更新会带来索引的更新。

索引的类型

  1. 普通索引 : key 。唯一的作用就是加快查询的速度

  2. 主键索引 : primary key 。字段具备唯一性 一张数据表中只有一个

  3. 唯一索引 : unique key 。

  4. 联合索引 : key(a,b,c)

  5. 外键索引 : 在我现在的认识中,就是用来维护数据表之间的相关性的,并且会导致数据的写入等操作的速度过慢,所以。。好像没啥用(对于较大的项目)

  6. 全文索引 : FULLTEXT(column1, column2) mysql5.6以前的InnoDB表不支持。使用:WHERE MATCH(column) AGAINST('search_content')

索引在使用上的注意点

  1. 索引字段上使用 WHERE DAY(column)='' 或 WHERE column*2=100这种运算,索引不会被使用到

  2. 在索引的字段上 使用NOT IN,<>,!=这些运算符的时候,执行explain会使用到索引,但是这些操作是不被推崇的,因为就算是用到了索引速度也不会很快.而且在mysql的5.6版本以前这种方式就算执行explain操作也是是用不到索引的

  3. 在索引字段上使用 likeregexp操作的时候,%的通配符不能放在要查找的字符串的左侧(可以想象使用索引的时候就是在查字典,比如想要找到'mysql'这个单词,需要从m开始,然后是y,所以查询的顺序就是从左往右的)

  4. 关于联合索引的一些注意事项:

    1. 如果给一张表添加的一组联合索引如下: key(name,email,age) ,mysql在添加联合索引的时候以‘最左前缀’的形式进行索引的添加,那么在进行查询select *的时候[name] [name,email] [name,email,age] 这三组查询条件都是可以使用到这个组合索引的,但是这并不是重点

    2. 如果现在使用 explain select * from table where age=11会发现索引并没有被使用到。 可是执行 explain select name,email from table where age=11 .会发现这个索引被使用到了。 这种方式叫做索引覆盖,在执行explain语句的时候,会发现extra一栏中卫'Using Index',如果存储引擎使用的是InnoDB,二级索引也存储了primary key的值,如果用过索引去访问primary key的值,也可以访问到

  5. 还有就是 关于添加联合索引还是单列索引的问题。如果字段都被添加成单列的索引,相比于联合索引的话,会增加数据库的IO的等待

  6. 索引的确可以加快mysql在查询时候的速度。但是在数据进行新增及更新等操作的时候,也需要对应的维护索引关系(但是也有配置可以在数据:DELAY_KEY_WRITE,不深入展开)

  7. 在使用多个条件进行数据的查询的时候,有网上的很多说法都是mysql中单次sql的查询只能使用到一个索引(这个是错误的!!) 一条sql语句,针对一张表的查询,多个条件之间使用and拼接的话,索引在mysql内部会被执行 union的操作,索引是可以使用到的! 但是!如果条件之间使用or进行条件的拼接的话,那么如果想要该语句的索引有效就必须保证每个被or连接的条件都可以使用到索引。

索引的长度

比如果我现在想要给 用户表的用户家庭住址字段添加索引,该字段:address 的类型为varchar(255) ,对整个字段建立索引的话肯定是不合理的,这个时候需要为该字段的前n个值建立索引。可以使用 
select count(distinct substring(字段,1,结束位置)) from 表
对比一下表中的总数据看一下该n值得选择性,用来确定索引的长度

Mysql 中创建索引和索引的使用问题的更多相关文章

  1. Mysql中主键与索引

    摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...

  2. MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】

    MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...

  3. mysql 中创建存储过程

    mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...

  4. 在MySQL中创建实现自增的序列(Sequence)的教程

    这篇文章主要介绍了在MySQL中创建实现自增的序列(Sequence)的教程,分别列举了两个实例并简单讨论了一些限制因素,需要的朋友可以参考下 项目应用中,曾有以下一个场景: 接口中要求发送一个int ...

  5. EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型

    官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...

  6. C# 利用mysql.data 在mysql中创建数据库及数据表

    C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...

  7. mysql中创建函数时报错信息

    报错信息如下 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its ...

  8. 高性能mysql:创建高性能的索引

    本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...

  9. SqlServer中创建非聚集索引和非聚集索引

    聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索 ...

随机推荐

  1. The jQuery HTML5 Audio / Video Library (jQuery jPlayer插件给你的站点增加视频和音频功能)

    http://jplayer.org/ The jQuery HTML5 Audio / Video Library jPlayer is the completely free and open s ...

  2. Android 逆向project 实践篇

    Android逆向project 实践篇 上篇给大家介绍的是基础+小Demo实践. 假设没有看过的同学能够进去看看.(逆向project 初篇) 本篇主要给大家介绍怎样反编译后改动源代码, 并打包执行 ...

  3. 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答

    目录 1 马虎的算式 2 黄金连分数 3 有理数类 4 幸运数 5 连号区间数   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 马虎的算式 标题: 马虎的算式 小明 ...

  4. codeforces Epic Game 题解

    Simon and Antisimon play a game. Initially each player receives one fixed positive integer that does ...

  5. MSSQL语句批量替换表中某列字段内容的某个字符

    UPdate 表 Set 字段名=REPLACE(字段名,'查找目标字符','要替换的字符') 比如:在Products表中把字段CharCode中含有ch-的字符全部替换为dw- UPDATE Pr ...

  6. UIkit – 轻量级前端框架

    原始地址:UIkit – 轻量级前端框架 高效轻量级前端框架: 来自:咕噜分享

  7. 使用spring的事务的三种方法

    1.编程式事务管理 spring的配置文件 <!-- 事务管理器 --> <bean id="transactionManager" class="or ...

  8. TP3.2之引入第三方类库文件和普通.php文件

    1.引入第三方类库 .class.php文件 1.1 类库有写namespace命名空间 namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/ ...

  9. ios block常见的错误(二)——循环引用

    这篇博文继续block的常见错误——循环引用. 循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用. 读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁 ...

  10. O(n)复杂度求没有出现的数字(leetcode448)

    一个长度为N的数组,其中元素取值为1-N,求这个数组中没有出现的.1-N之间的数字. 要求无额外空间,O(n)时间复杂度. nums[i]=-1表示i数字已经出现过了 class Solution(o ...