Mysql 中创建索引和索引的使用问题
在数据库中合理的使用索引是提升mysql数据库的一种高效和快捷的方式,但是在索引的使用上在我的使用中发现有很多坑,因为自己之前没有认识到,所以来总结一下
索引的介绍
索引是一种特殊的文件,其中包含着对数据表中的所有记录的引用指针
添加索引的条件
字段中存储的内容重复性不能过高,比如性别,颜色等这些可区分性很低的字段
字段会经常性的用作查询语句。 因为创建索引也是需要存储的空间的,而且创建了索引会造成insert等语句的速度变慢
字段更新的斌率不高的字段适合添加索引。数据的更新会带来索引的更新。
索引的类型
普通索引 :
key
。唯一的作用就是加快查询的速度主键索引 :
primary key
。字段具备唯一性 一张数据表中只有一个唯一索引 :
unique key
。联合索引 :
key(a,b,c)
。外键索引 : 在我现在的认识中,就是用来维护数据表之间的相关性的,并且会导致数据的写入等操作的速度过慢,所以。。好像没啥用(对于较大的项目)
全文索引 :
FULLTEXT(column1, column2)
mysql5.6以前的InnoDB表不支持。使用:WHERE MATCH(column) AGAINST('search_content')
索引在使用上的注意点
索引字段上使用
WHERE DAY(column)='' 或
WHERE column*2=100
这种运算,索引不会被使用到在索引的字段上 使用
NOT IN
,<>
,!=
这些运算符的时候,执行explain会使用到索引,但是这些操作是不被推崇的,因为就算是用到了索引速度也不会很快.而且在mysql的5.6版本以前这种方式就算执行explain
操作也是是用不到索引的在索引字段上使用
like
或regexp
操作的时候,%
的通配符不能放在要查找的字符串的左侧(可以想象使用索引的时候就是在查字典,比如想要找到'mysql'这个单词,需要从m开始,然后是y,所以查询的顺序就是从左往右的)关于联合索引的一些注意事项:
如果给一张表添加的一组联合索引如下:
key(name,email,age)
,mysql在添加联合索引的时候以‘最左前缀’的形式进行索引的添加,那么在进行查询select *
的时候[name] [name,email] [name,email,age]
这三组查询条件都是可以使用到这个组合索引的,但是这并不是重点如果现在使用
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的值,也可以访问到
还有就是 关于添加联合索引还是单列索引的问题。如果字段都被添加成单列的索引,相比于联合索引的话,会增加数据库的IO的等待
索引的确可以加快mysql在查询时候的速度。但是在数据进行新增及更新等操作的时候,也需要对应的维护索引关系(但是也有配置可以在数据:DELAY_KEY_WRITE,不深入展开)
在使用多个条件进行数据的查询的时候,有网上的很多说法都是mysql中单次sql的查询只能使用到一个索引(这个是错误的!!) 一条sql语句,针对一张表的查询,多个条件之间使用
and
拼接的话,索引在mysql内部会被执行 union的操作,索引是可以使用到的! 但是!如果条件之间使用or
进行条件的拼接的话,那么如果想要该语句的索引有效就必须保证每个被or
连接的条件都可以使用到索引。
索引的长度
比如果我现在想要给 用户表的用户家庭住址字段添加索引,该字段:address
的类型为varchar(255) ,对整个字段建立索引的话肯定是不合理的,这个时候需要为该字段的前n个值建立索引。可以使用 select count(distinct substring(字段,1,结束位置)) from 表
对比一下表中的总数据看一下该n值得选择性,用来确定索引的长度
Mysql 中创建索引和索引的使用问题的更多相关文章
- Mysql中主键与索引
摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...
- MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】
MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...
- mysql 中创建存储过程
mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...
- 在MySQL中创建实现自增的序列(Sequence)的教程
这篇文章主要介绍了在MySQL中创建实现自增的序列(Sequence)的教程,分别列举了两个实例并简单讨论了一些限制因素,需要的朋友可以参考下 项目应用中,曾有以下一个场景: 接口中要求发送一个int ...
- EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型
官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...
- C# 利用mysql.data 在mysql中创建数据库及数据表
C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...
- mysql中创建函数时报错信息
报错信息如下 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its ...
- 高性能mysql:创建高性能的索引
本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...
- SqlServer中创建非聚集索引和非聚集索引
聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索 ...
随机推荐
- 关于CodeFirst的使用教程
请参考:http://www.cnblogs.com/lxblog/archive/2013/05/22/3092428.html 很全面实用,谢谢作者的付出!
- HDU 5399 Too Simple(过程中略微用了一下dfs)——多校练习9
Too Simple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ...
- Codeforces554C:Kyoya and Colored Balls(组合数学+费马小定理)
Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...
- Zuul使用Ribbon配置自动重试
spring cloud的版本不断演进,导致很多配置的配置方式不断改变,有时某个配置在一个版本里面默认是true,后边一升级默认成了false,这点让人有点不爽. 言归正传 0.所使用版本 sprin ...
- /etc/fstab 参数详解(转)
转自:http://blog.csdn.net/duyiwuer2009/article/details/8644753/ /dev/hda5 /home/new ...
- java Socket Tcp示例三则(服务端处理数据、上传文件)
示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...
- 【redis】常用命令
三.常用命令 1)连接操作命令 quit:关闭连接(connection) auth:简单密码认证 help cmd: 查看cmd帮助,例如:help quit ...
- [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路
来源于:http://www.jianshu.com/p/5124eef40bf0 [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路 手把手教你整合最优雅SSM框架:S ...
- mysql中的order by
一.order by的原理 1.利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 ran ...
- 简单易懂的Ubuntu生存战略:开启无线网卡的wifi热点,ap模式
在ubuntu下如何把无线网卡设置成可供wifi设备上网的接入点 因为某些移动设备对wifi热点的要求有些苛刻,p2p模式的无线连接方式虽然易设置,但是实用性不高. 相对而言,创建一个虚拟无线路由器成 ...