Mysql 索引

索引

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)

使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度

索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容

索引是表中一列或者若干列值排序的方法

建立索引的目的是加快对表中记录的查找或排序

索引的作用

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因

当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度

可以降低数据库的 IO 成本,并且索引还可以降低数据库的排序成本

通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性

可以加快表与表之间的连接

在使用分组和排序时,可大大减少分组和排序的时间

索引的副作用

索引需要占用额外的磁盘空间;对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址

而 InnoDB 引擎的表数据文件本身就是索引文件;在插入和修改数据时要花费更多的时间,因为索引也要随之变动

创建索引的原则依据

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担
表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位

记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能

经常与其他表进行连接的表,在连接字段上应该建立索引

唯一性太差的字段不适合建立索引

更新太频繁地字段不适合创建索引

经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引
select name,score from ky19 where id=1

索引应该建在选择性高的字段上

索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

索引的分类与创建

普通索引

最基本的索引类型,没有唯一性之类的限制;针对所有字段进行创建

  • 直接创建

create index 索引名 on 表名 (所指的字段);

mysql> create index id_name on njzb (id);#为 njzb 这个表的 id 字段创建一个普通索引

前提是在创建表后进行操作

  • 修改表的方式创建

alter table 表名 add index 索引名 (字段);

mysql> alter table njzb add index id_index (id);#为 njzb 这个表的 id 字段修改为普通索引

  • 创建表时指定索引

create table 表名 ( 字段1 数据类型, 字段2 数据类型[...], indix 索引名 (字段));

mysql> create table test(id int(4) not null,name varchar(10) not null,index id_index (id));

唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一

唯一索引允许有空值(注意和主键不同)

如果是用组合索引创建,则列值的组合必须唯一;添加唯一键将自动创建唯一索引

  • 直接创建唯

CREATE UNIQUE INDEX 索引名 ON 表名(列名);

mysql> create unique index name_index on ky20 (name);#为 ky20 表格的 name 字段创建唯一索引

前提是在创建表后进行操作

  • 修改表的方式创建

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

mysql> alter table ky20 add unique cardid_index (cardid);

  • 创建表时指定索引

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

mysql> create table ky30 (id int,name varchar(20),unique id_index (id));
mysql> show creat table ky30;

组合索引

可以是单列上创建的索引,也可以是在多列上创建的索引。

需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

  • 创表时指定组合索引

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

mysql> create table ky30 (id int not null,name varchar(20),cardid varchar(20),
index index_amd (id,name));
mysql> select id,name from ky30;

组合索引创建的字段顺序是其触发索引的查询顺序,否则不生效

主键索引

是一种特殊的唯一索引,必须指定为“PRIMARY KEY”

一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引

  • 创建表的时候指定

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

mysql> create table test2 (id int,name varchar(20),primary key (id));
mysql> show create table test1;

  • 修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名);

mysql> alter table ky30 add primary key (id);

全文索引

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息

全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引

(在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引)

  • 直接创建

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

mysql> create fulltext index remark_index on member (remark);

  • 修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

  • 创建表的时候指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

  • 使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

mysql> select * from member where match(remark) against('this is vip');
或
mysql> select * from member where remark='this is vip';

查看索引

show index from 表名;

show index from 表名\G;

竖向显示表索引信息

show keys from 表名\G;

show keys from 表名;

各字段的含义如下:

Table    表的名称
Non_unique    如果索引内容唯一,则为 0;如果可以不唯一,则为 1
Key_name    索引的名称
Seq_in_index    索引中的列序号,从 1 开始。 limit 2,3
Column_name    列名称
Collation    列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)
Cardinality    索引中唯一值数目的估计值
Sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan),如果整列被编入索引,则为 NULL
Packed    指示关键字如何被压缩。如果没有被压缩,则为 NULL
Null    如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO
Index_type    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
Comment    备注

删除索引

  • 直接删除索引

DROP INDEX 索引名 ON 表名;

mysql> drop index name_index on member;

  • 修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

mysql> alter table member drop index id_index;

  • 删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

mysql> alter table member drop primary key;

索引总结

索引分为

  • 普通索引 :针对所有字段,没有特殊的需求/规则
  • 唯一索引 : 针对唯一性的字段,仅允许出现一次空值
  • 组合索引 (多列/多字段组合形式的索引)
  • 全文索引(varchar char text)MySQL为了优化对文本内容搜索的一种机制
  • 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

创建索引

  • 在创建表的时候,直接指定index
  • alter修改表结构的时候,进行add 添加index
  • 直接创建索引index

PS:主键索引 —— 直接创建主键即可

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

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

相关文章

spring的后置处理器BeanPostProcessor

什么是BeanPostProcessor 是spring IOC容器给我们提供的一个扩展接口在调用初始化方法前后对bean进行额外加工,ApplicationContext会自动扫描实现了BeanPostProcessor的bean,并注册这些bean为后置处理器是bean的统一前置后置处理而不是基于某一个bean 执…

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 三、总结 一、理论 1.CA认证中心 (1)概念 CA :CertificateAuthority的缩写,通常翻译成认证权威或者认证中心,主要用途是为用户…

defaultdict, Counter, json包中的load, dump是否都保持插入顺序

自python3.7以来,python的dict都会保留插入顺序,那么相关的defaultdict, Counter,以及使用json.load、json.dump也一定能保持顺序吗? 结论:以上这些和dict一样,都会保留插入顺序 defaultdict:…

Linux防火墙相关命令

防火墙基础命令 systemctl status firewalld #查看防火墙状态 systemctl start firewalld #开启防火墙 systemctl stop firewalld #临时关闭 systemctl disable firewalld.service #关闭自启 systemctl enable firewalld.servi…

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源(图片、JS、CSS), WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下,完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…

十四、组合模式

一、什么是组合模式 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单…

从零开始搭建并运行mmsegmentation

安装: Step 1:创建Conda 环境并激活之 conda create --name openmmlab python3.8 -y conda activate openmmlab Step 2:CUDA版本选择,及安装Pytorch 关于设备GPU的cuda版本,根据如下的选择原则: 对于Ampere架构的…

无感刷新:Vue前端实现Token的无缝刷新机制

在现代Web应用程序中,用户身份验证和授权通常使用令牌(Token)机制来实现。然而,由于Token的过期时间限制,用户在长时间使用应用程序时可能需要重新登录。为了提供更好的用户体验,我们可以通过实现Token的无…

Python 和 C++ 使用细节差别

1. 循环中的可迭代对象长度 1. 循环中的可迭代对象长度 C 中&#xff0c;for循环中写明a.size()&#xff0c;每次循环这个值是重新计算的&#xff1b; # include “iostream” # include <vector> using namespace std;int main() {vector<int> a(10);int cnt 0…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆

2023年&#xff0c;中国改革开放迎来了45周年&#xff0c;改革春风浩荡&#xff0c;席卷神州大地&#xff0c;45年间&#xff0c;中国特色社会主义伟大事业大步迈入崭新境界&#xff0c;一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行&#xff0c;不仅使中国的经济…

学会电子商务个性化这一招,让你的客户源源不断

在增加销售额和创建客户喜爱的品牌时&#xff0c;电子商务个性化是您成功的关键。但是&#xff0c;个性化您的在线购物体验的各个方面似乎都不是那么简单。 幸运的是&#xff0c;您看到了这一篇文章。在本文中&#xff0c;我们将探讨为什么电子商务个性化如此重要。在此过程中…

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…

C# Timer定时器

C# Timer定时器 Timer定时器定时器主要用到的就是Timer的Tick事件&#xff0c;另外还要设置时间间隔&#xff1a; 下面这个实力演示了每隔一秒&#xff0c;picturebox中的图片来回切换&#xff0c;每隔一秒&#xff0c;文本框中显示当前时间。 using System; using System.Co…

5. 线性层及其他层

5.1 神经网络结构 5.2 线性拉平 import torch import torchvision from torch import nn from torch.nn import ReLU from torch.nn import Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datase…

【核心复现】基于合作博弈的综合能源系统电-热-气协同优化运行策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

信看课堂笔记—LDO和DC-DC电路打PK

LDO&#xff08;low dropout voltage regulator&#xff0c;低压差线性稳压器&#xff09;和DC-DC(Direct current-Direct current converter&#xff0c;直流电压转直流电压转换器)电源是非常常见的电源电路&#xff0c;LDO 出来的比较早&#xff0c;像老戏骨一样&#xff0c;…

kotlin实现java的单例模式

代码 package com.flannery.interviewdemo.singleinstance//https://blog.csdn.net/Jason_Lee155/article/details/128796742 Java实现 //public class SingletonDemo { // private static SingletonDemo instancenew SingletonDemo(); // private SingletonDemo() // …

1.00001git源码clone后进行编译(带调试)

– 新建用户 useradd postgres passwd postgres – 用户加入sude组 先cd到/etc/sudoers目录下 由于sudoers文件为只读权限&#xff0c;所以需要添加写入权限&#xff0c;chmod uw sudoers vim sudoers 找到root ALL (ALL) ALL这一行&#xff0c;在下一行加入username ALL (A…

LeetCode每日一题:1654. 到家的最少跳跃次数(2023.8.30 C++)

目录 1654. 到家的最少跳跃次数 题目描述&#xff1a; 实现代码与解析&#xff1a; bfs 1654. 到家的最少跳跃次数 题目描述&#xff1a; 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 …