mysql索引创建及使用注意事项

总结:

1、在使用索引时,一般情况下不建议使用like操作。如果使用,则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.(最左缀原则)

2、单列索引的使用:

《1》 只涉及到其中一个字段时,都能使用到索引

《2》模糊查询时,%如果在前面,那么不会使用索引

《3》涉及到多个索引字段时,如果这些索引字段中,存在主键索引,那么只会使用该索引

《4》涉及到多个索引字段时,如果这些索引字段中,不存在主键索引的话,那么就会使用该使用的索引(注:如果通过其中的部分索引就能准确定位的话,那么其余的索引就不再被使用)

《5》当对索引字段进行 >, <,>=, <=,not in,between …… and ……,函数(索引字段,substr),like模糊查询%在字段前时不会使用该索引

总结mysql索引失效的N种情况 https://www.jianshu.com/p/3ccca0444432

3、组合索引的使用:

最左原则:
       假设组合索引为:a,b,c的话;那么当SQL中对应有:a或a,b或a,b,c的时候,可称为完全满足最左原则;当SQL中对应只有a,c的时候,可称为部分满足最左原则;当SQL中没有a的时候,可称为不满足最左原则。

注:SQL语句中的对应条件的先后顺序无关。
《1》当完全满足最左原则时,所有字段都会使用组合索引

《2》当部分满足最左原则时,只有a字段会使用组合索引(a,c 中只有a会使用组合索引)

《3》当不满足最左原则时,不使用组合索引

《4》满足(部分满足)最左原则的字段里,有字段不满足“索引”自身的使用规范:

           说明:如果SQL语句里的字段里,满足了最左原则,但是不满足“索引”自身的使用规范,那么组合索引走到这里之后,
           不会再往下走了

索引的创建:

建表时创建:

CREATE TABLE 表名(

字段名 数据类型 [完整性约束条件],

       ……,

[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY

[索引名](字段名1 [(长度)] [ASC | DESC]) [USING 索引方法]

);

说明:

  • UNIQUE:可选。表示索引为唯一性索引。
  • FULLTEXT:可选。表示索引为全文索引。
  • SPATIAL:可选。表示索引为空间索引。
  • INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是    一样的。
  • 索引名:可选。给创建的索引取一个新名称。
  • 字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。
  • 长度:可选。指索引的长度,必须是字符串类型才可以使用。
  • ASC:可选。表示升序排列。
  • DESC:可选。表示降序排列。

注:索引方法默认使用BTREE。

单列索引(示例):

CREATE TABLE projectfile (id INT AUTO_INCREMENT COMMENT '附件id',fileuploadercode VARCHAR(128) COMMENT '附件上传者code',projectid INT COMMENT '项目id;此列受project表中的id列约束',filename VARCHAR (512) COMMENT '附件名',fileurl VARCHAR (512) COMMENT '附件下载地址',filesize BIGINT COMMENT '附件大小,单位Byte',-- 主键本身也是一种索引(注:也可以在上面的创建字段时使该字段主键自增)PRIMARY KEY (id),-- 主外键约束(注:project表中的id字段约束了此表中的projectid字段)FOREIGN KEY (projectid) REFERENCES project (id),-- 给projectid字段创建了唯一索引(注:也可以在上面的创建字段时使用unique来创建唯一索引)UNIQUE INDEX (projectid),-- 给fileuploadercode字段创建普通索引INDEX (fileuploadercode)-- 指定使用INNODB存储引擎(该引擎支持事务)、utf8字符编码
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT '项目附件表';

注:这里只为示例如何创建索引,其他的合理性之类的先放一边。

组合索引(示例):

CREATE TABLE projectfile (id INT AUTO_INCREMENT COMMENT '附件id',fileuploadercode VARCHAR(128) COMMENT '附件上传者code',projectid INT COMMENT '项目id;此列受project表中的id列约束',filename VARCHAR (512) COMMENT '附件名',fileurl VARCHAR (512) COMMENT '附件下载地址',filesize BIGINT COMMENT '附件大小,单位Byte',-- 主键本身也是一种索引(注:也可以在上面的创建字段时使该字段主键自增)PRIMARY KEY (id),-- 创建组合索引INDEX (fileuploadercode,projectid)-- 指定使用INNODB存储引擎(该引擎支持事务)、utf8字符编码
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT '项目附件表';


建表后创建:

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL]  INDEX | KEY  [索引名] (字段名1 [(长度)] [ASC | DESC]) [USING 索引方法];

CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 ON  表名(字段名) [USING 索引方法]

示例一:

-- 假设建表时fileuploadercode字段没创建索引(注:同一个字段可以创建多个索引,但一般情况下意义不大)
-- 给projectfile表中的fileuploadercode创建索引
ALTER TABLE projectfile ADD UNIQUE INDEX (fileuploadercode);


示例二:

ALTER TABLE projectfile ADD INDEX (fileuploadercode, projectid);


示例三:

-- 将id列设置为主键
ALTER TABLE index_demo ADD PRIMARY KEY(id) ;
-- 将id列设置为自增
ALTER TABLE index_demo MODIFY id INT auto_increment;  
查看已创建的索引:
show index from 表名;

查看已创建的索引:

show index from 表名;

提示:我们也可以直接使用工具查看

示例:

索引的删除:


DROP INDEX 索引名 ON 表名

ALTER TABLE 表名 DROP INDEX 索引名

示例一:

drop index fileuploadercode1 on projectfile;


示例二:

alter table projectfile drop index s2123;


查看SQL语句对索引的使用情况(即:查询SQL的查询执行计划QEP):
在select语句前加上EXPLAIN即可。

示例:

EXPLAIN SELECT * FROM `index_demo` ii WHERE ii.e_name = 'Jane';


分析该SQL的性能为:

提示:我们也可以使用SQL工具查看,如:navicat中的“解释”选项即可查看。

说明:

id:SELECT识别符。这是SELECT的查询序列号。

select_type:SELECT类型。

  1. SIMPLE: 简单SELECT(不使用UNION或子查询)
  2. PRIMARY: 最外面的SELECT
  3. UNION:UNION中的第二个或后面的SELECT语句
  4. DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
  5. UNION RESULT:UNION的结果
  6. SUBQUERY:子查询中的第一个SELECT
  7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
  8. DERIVED:导出表的SELECT(FROM子句的子查询)

table:表名

type:联接类型。是SQL性能的非常重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref
            > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。
            一般来说,得保证查询至少达到range级别。

  1. system:表仅有一行(=系统表)。这是const联接类型的一个特例。
  2. const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。
  3. eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。
  4. ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref可以用于使用=或<=>操作符的带索引的列。
  5. ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
  6. index_merge:该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
  7. unique_subquery:该类型替换了下面形式的IN子查询的ref:value IN (SELECT primary_key FROMsingle_table WHERE some_expr);unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
  8. index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
  9. range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range
  10. index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
  11. all:对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。

possible_keys:possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意,该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

key:key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len:key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。注意通过key_len值我们可以确定MySQL将实际使用一个多部关键字的几个部分。

ref:ref列显示使用哪个列或常数与key一起从表中选择行。

rows:rows列显示MySQL认为它执行查询时必须检查的行数。

Extra:该列包含MySQL解决查询的详细信息。

  1. Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
  2. Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
  3. range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。
  4. Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。
  5. Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略。
  6. Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
  7. Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。
  8. Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
  9. Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

单列索引的使用:


准备工作:

给id加主键索引:

再分别给name、city、country、address加上普通索引:

注:以上五个索引都是单列索引。

使用情况:

只涉及到其中的一个字段时,都能使用到索引(以e_name为例):

注:模糊查询时,%如果在前面,那么不会使用索引。

涉及到多个索引字段时,如果这些索引字段中,存在主键索引,那么只会使用该索引(即:MYSQL优化器会选出并先执行最“严”的索引):

提示:possible_key中,只是SQL语句里涉及到的索引;key中才是实际上执行查询操作时使用到了的索引。

涉及到多个索引字段时,如果这些索引字段中,不存在主键索引的话,那么就会使用该使用的索引(注:如果通过其中的部分索引就能准确定位的话,那么其余的索引就不再被使用):

注:多个索引时,先使用哪个索引后使用哪个索引,是由MySQL的优化器经过一些列计算后作出的抉择。

当对索引字段进行 >, <,>=, <=,not in,between …… and ……,函数(索引字段),like模糊查询%在字段前时不会使用该索引

注:这里对e_age字段进行了 “<” ,所以实际查询时,并没有使用e_age的索引。

提示:在实际使用时,如果涉及到多列,我们一般都不会将这些列一 一创建为单列索引,而是将这些列创建为组合索引。

组合索引的使用:

最左原则:
       假设组合索引为:a,b,c的话;那么当SQL中对应有:a或a,b或a,b,c的时候,可称为完全满足最左原则;当SQL中对应只有a,c的时候,可称为部分满足最左原则;当SQL中没有a的时候,可称为不满足最左原则。

创建了组合索引:e_name,e_age,e_country,e_city

使用情况:

完全满足最左原则:

注:与条件的先后无关,即:下面这样的话,也是会完整的走组合索引的:

部分满足最左原则

注:此SQL中,只有e_name和e_country满足部分最左原则(e_name满足),所以到e_name字段时会走组合所以,但是
       只会走到e_name那里,到e_country时就不会使用组合索引了。

不满足最左原则

满足(部分满足)最左原则的字段里,有字段不满足“索引”自身的使用规范

说明:如果SQL语句里的字段里,满足了最左原则,但是不满足“索引”自身的使用规范,那么组合索引走到这里之后,
           不会再往下走了。

如图所示:由于e_age字段使用了“>”符号,不符合“索引”自身的使用规范,那么当“e_name”走完组合索引后,
                  走到“e_age”时,该字段及其后面的字段不会再走组合索引了。

^_^ 如有不当之处,欢迎指正
^_^ 参考链接
        https://www.cnblogs.com/DreamDrive/p/7752960.html、 
        https://www.cnblogs.com/tommy-huang/p/4317305.html、
        https://blog.csdn.net/linjpg/article/details/56054994、
        https://www.jb51.net/article/118371.html
^_^ 如涉及侵权问题,请及时联系我
^_^ 本文已经被收录进《程序员成长笔记(二)》,笔者JustryDeng
 ———————————————— 
版权声明:本文为CSDN博主「justry_deng」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/justry_deng/article/details/81458470

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启&#xff0c;和平精英与刺激战场有什么不同呢&#xff1f;今天小编就为大家带来了信号值详解&#xff01;各位玩家千万不要错过呀&#xff01;信号值详解信号接收区和信号值是什么&#xff0c;对选手有什么影响&#xff1f;在游戏战斗界面中&#xff0…

c语言编程判断素数的函数,【面试题】C语言:实现一个函数,判断一个数是不是素数。...

#include#include#includeint prime(int num){int k 0;int i 0;k sqrt(num);for (i 2; i < k; i) /*不满足循环条件时即均不可被整除&#xff0c;不是素数*/{if (num%i 0){return 0;}}return -1;}int main(){int num 0;int ret 0;printf("please input the nu…

Linux命令 umask,chmod使用

一、文件权限详解 1、文件权限介绍 在linux中的每一个文件或目录都包含有访问权限&#xff0c;这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下三种访问方式限制访问权限&#xff1a;只允许用户自己访问&#xff1b;允许一个预先指定的用户组中…

python启动c语言gdb,使用gdb调试python程序

游戏服务器菜鸟之C&num;初探三游戏服务在经过上述2番折腾之后,最后决定使用TCP进行通信,所以在一次进行重构 主要重构的要点 1.将过来的HTPP请求,重构为TCP请求: 2.使用组件FluenScheduler进行怪物的定时刷新,和定时 ...Windows环境下的NodeJS&plus;NPM&plus;Bower…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…

递归题型解析

#include<iostream> using namespace std; int foo(int n) {if (n < 1)return n;return (foo(n - 1) foo(n - 2)); } int main() {printf("%d\n", foo(5));return 0; } 解析&#xff1a; foo(5)foo(4)f00(3)foo(3)foo(2)foo(3)2foo(3)foo(2)2(foo(2)foo(1…

64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

简介最近学习了一下_IO_FILE的利用&#xff0c;刚好在pwnable.tw上碰到一道相关的题目。拿来做了一下&#xff0c;遇到了一些困难&#xff0c;不过顺利解决了&#xff0c;顺便读了一波相关源码&#xff0c;对_IO_FILE有了更深的理解。文章分为三部分&#xff0c;分别是利用原理…

戴尔笔记本电脑开机黑屏怎么办_戴尔笔记本电脑充不进电怎么办

笔记本电脑电池充不进电要怎么办呢&#xff1f;笔记本电脑之所以这么受欢迎&#xff0c;是因为笔记本有配备电池&#xff0c;能够在没有电源的情况下使用五六个小时。而电池的电用光后&#xff0c;就需要进行充电。不过有些用户反映说&#xff0c;自己的电池充不进电&#xff0…

linux之trap命令

一. trap捕捉到信号之后&#xff0c;可以有三种反应方式&#xff1a;   (1)执行一段程序来处理这一信号   (2)接受信号的默认操作   (3)忽视这一信号 二. trap对上面三种方式提供了三种基本形式&#xff1a; 第一种形式的trap命令在shell接收到signal list清单中数…

IIS安装2个SSL_顶级域名0元撸-免费注册2个腾讯云域名 免费SSL证书

前言这两天折腾甜糖CDN&#xff0c;为了收益最大化申请了公网IP&#xff0c;于是顺带折腾了一下群晖外网访问。使用的DDNS方案是腾讯dnspod&#xff0c;注册一个便宜的顶级域名访问我的群晖&#xff0c;折腾过程中发现可以免费注册2个顶级域名&#xff0c;不敢独享发出来大家一…

c语言中文刷屏,c语言二维数组刷屏练习.doc

c语言二维数组刷屏练习// 二维数组的刷屏综合练习 编制于2012.9.23#include#include#include#include#define WIDTH 22//宏定义/***********************函数声明**********************************************/void init();//数组赋初值void print();//显示当前数组void mov…

三菱a系列motion软体_工控电缆如何制作?(以三菱PLC、触摸屏为例)

RS232接口的三菱Q系列PLC编程通讯电缆三菱GT11/GT15触摸屏RS232串口编程电缆三菱GT11/GT15触摸屏连接Q系列PLC电缆三菱GT11/GT15触摸屏连接FX2/FX2C/A/QnA系列PLC电缆三菱GT11/GT15 触摸屏连接FX3U/FX2N/FX1N系列PLC电缆FX2、A系列PLC到A970GOT人机介面连接电缆FX0s/FX0n/FX2n/…

c语言水仙花验证,[编程入门]水仙花数判断 (C语言代码)

解题思路:三个变量 判断一下 yes就输出注意事项:参考代码:#include using namespace std;int a[5];int used[5];int print[4];void dfs(int cur,int cont){if(cur 4){for(int i 1;i < 3;i){cout<}cout<return;}for(int i 1;i < 4;i){if(used[i] 0&&i !…

C/C++混淆点-与

简介&#xff1a; &&是逻辑与运算符&#xff0c;||是逻辑或运算符&#xff0c;都是逻辑运算符&#xff0c;两边只能是bool类型 &与| 既可以进行逻辑运算&#xff0c;又可以进行位运算&#xff0c;两边既可以是bool类型&#xff0c;又可以是数值类型 区别&#xf…

电脑入门完全自学手册_「新书推荐」新能源汽车维修完全自学手册

《新能源汽车维修完全自学手册》作者&#xff1a;广州瑞佩尔信息科技有限公司 、胡欢贵售价&#xff1a;85.00上市时间&#xff1a;2020年7月本书内容分为 8 章, 第 1 章为高压安全系统, 主要介绍了新能源汽车中高压安全防护装置构造以及维修所需的安全防护工具、 安全作业规范…

c语言 整型转bool,C语言的布尔类型(_Bool)【转】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 我们自己定义的“仿布尔型”在C99标准被支持之前&#xff0c;我们常常自己模仿定义布尔型&#xff0c;方式有很多种&#xff0c;常见的有下面两种&#xff1a;view plaincopy to clipboardprint?/* 第一种方法 */#define TRUE …

C/C++混淆点-左移右移操作符

对一个数实行左移或者右移操作&#xff0c;即先把操作数转换为二进制&#xff0c;然后左移&#xff08;>>&#xff09;即从左到右开始舍弃&#xff0c;右移&#xff08;<<&#xff09;即从各位之后开始加0。最后再转换为十进制。 #include<iostream> using…

ar路由器 pppoe下发ipv6 dns_IPv6网络设置各种疑难杂症诊疗区

1、Windows电脑系统IPv6无网络访问权限怎么解决&#xff1f;Win7系统下连接IPv6无网络访问权限的解决方法&#xff08;1&#xff09;首先修复网络连接&#xff0c;Win XP操作系统的网络连接有“修复”选项&#xff0c;Win7没有&#xff0c;不过可以使用“诊断”选项&#xff0c…

c语言判断化学方程式,下列是某同学写的六个化学方程式:①Mg+O2点燃.MgO2②C+O2点燃.CO...

化学方程式是最重要的化学语言&#xff0c;正确、熟练地书写化学方程式是学习化学必需具备的重要基本功。怎样书写化学方程式?1.要遵循两个基本原则(1)以客观事实为基础化学方程式既然是化学反应的表达形式&#xff0c;显然&#xff0c;有某一反应存在&#xff0c;才能用化学方…

tensorboard ckpt pb 模型的输出节点_“技术需求”与“技术成果”项目之间关联度计算模型 TOP10 baseline...

竞赛网址&#xff1a;传送门线上分数&#xff1a;0.78490746000&#xff0c;目前可以进入前10参考了苏神的代码&#xff0c;非常感谢&#xff1a;传送门调参技巧&#xff1a;传送门中文bert权重&#xff1a;传送门#! -*- coding:utf-8 -*-