当前位置: 首页 > news >正文

MySQL基础之 索引

MySQL索引讲解

索引的好处:

  MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

  打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

  索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

  创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

  实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

索引的缺点:

  过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

  建立索引会占用磁盘空间的索引文件。

索引的设计原则

1、选择唯一性索引,也就是说多选择那些设置为主键,唯一性UNIQUE的字段来建立索引

2、为经常排序、分组的字段建立索引

3、常用作查询条件的字段建立索引,也就是常在WHERE等等子句中指定查询的列。

4、建立合适数量的索引,并不是索引越多越好

5、尽量使用数据量少的字段建立索引

6、尽量使用前缀来建立索引,比如TEXT和BLOG类型的字段,对前面的几个字符建立索引即可

7、不用的索引及时删除。

 

创建索引的两种方式

1、创建新表的同时创建索引。

2、如果对已存在的表创建索引,使用CREATE   INDEX命令或者ALTER   TABLE命令

现在来分析这两种用法

一、创建新表的同时创建索引。

CREATE   TABLE   TABLE_NAME(字段名  数据类型 ,

              ................,

              [UNIQUE  | FULLTEXT  ]  INDEX   |  PRIMARY  KEY,

              [INDEX_NAME](fileld1,field2........  [(length)]  [ ASC|DESC ]);

              );

UNIQUE  |  FULLTEXT   INDEX:这两个选取其中任意一个,比如选择UNIQUE   INDEX表示创建唯一索引,FULLTEXT   INDEX表示创建全文索引。也可以直接就写INDEX表示创建普通索引。

PRIMARY  KEY:表示创建主键索引。

INDEX_NAME:索引的名称。

filed:最后跟上field,表示对哪个字段创建的索引,还可以跟多个列表示使用多列索引。

length:索引的长度,必须是字符串类型的字段才可以使用。

二、已存在的表使用CREATE INDEX命令或者ALTER TABLE命令

创建普通索引

1、CREATE  INDX 

 CREATE  INDEX   INDEX_NAME   ON   TABLE_NAME(’COLUMN_NAME’);

 注释:COLUMN_NAME是要创建索引的列。

 如果创建不止一个索引,多个COLUMN_NAME之间用逗号隔开即可。

2、ALTER   TABLE 修改表结构(添加索引)

  ALTER   TABLE   TABLE_NAME   ADD   INDEX   INDEX_NAME(‘COLUMN_NAME’);

3、删除索引

 DROP   INDEX   INDEXNAME   ON   TABLE_NAME;

 ALTER   TABLE   TABLE_NAME  DROP  INDEX   INDEX_NAME;

创建唯一索引

1、CREATE   INDEX

 CREATE   UNIQUE   INDEX   INDEX_NAME   ON   TABLE_NAME(’COLUMN_NAME’);

 如果创建不止一个索引,多个COLUMN_NAME之间用逗号隔开。

2、ALTER   TABLE修改表结构(添加索引)

 ALTER   TABLE   TABLE_NAME   ADD   UNIQUE   INDEX_NAME(‘COLUMN_NAME’)

3、删除索引

 ALTER   TABLE   TABLE_NAME   DROP   INDEX   INDEX_NAME;

创建主键索引

主键只能作用在一个列上,添加主键索引时,主键默认不为空(NOT   NULL)。

1、ALTER   TABLE修改表结构

 ALTER  TABLE   TABLE_NAME   MODIFY   TABLE_NAME   DEFINATION   NOT   NULL;

 ALTER   TABLE   TABLE_NAME   ADD   PRIMARY   KEY('COLUMN_NAME');

2、删除索引

 ALTER   TABLE   TABLE_NAME   DROP   PRIMARY   KEY;   #因为一个表中只能有一个主键,所以不需要指定索引名

总结:不能用CREATE   INDEX语句创建PRIMARY   KEY索引。

显示索引信息

SHOW   INDEX显示信息,\G格式化输出

SHOW   INDEX   FROM   TABLE_NAME;\G

 

联合索引

联合索引就是对多个字段同时建立的索引,多列索引使用的时候是有要求的,就是只有查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用。

举个例子:

mysql> desc test1_1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| grade | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table test1_1 add index id_g (id,grade);                 # id为联合索引的第一个字段
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from test1_1 where id =2 \G            # 使用联合索引的第一个字段进行查询
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1_1
   partitions: NULL
         type: ref
possible_keys: id_g                               #使用了索引
          key: id_g
      key_len: 4
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from test1_1 where grade = 90 \G        #使用联合索引的第二个字段查询,
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1_1
   partitions: NULL
         type: ALL
possible_keys: NULL                               # 发现没有使用索引
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 6
     filtered: 16.67
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from test1_1 where id = 3 AND grade=95 \G;         # 使用联合索引的两个字段都作为查询条件
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1_1
   partitions: NULL
         type: ref
possible_keys: id_g                                  # 使用了联合索引
          key: id_g
      key_len: 6
          ref: const,const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR: 
No query specified

 

删除索引

删除索引一般我们要使用建立索引时的索引名,可以使用show  create  table  table_name;\G命令来查看之前建立索引的名称。

删除索引的语法:DROP  INDEX   INDEX_NAME  ON  TABLE_NAME;

删除主键索引的语法:ALTER  TABLE  TABLE_NAME  DROP  PRIMARY  KEY;

 

转载于:https://www.cnblogs.com/FengGeBlog/p/9774179.html

相关文章:

  • 2.2 目录及文本文件操作命令
  • 等等!这两个 Spring-RabbitMQ 的坑我们已经替你踩了
  • 内存对齐
  • opencv提取保存轮廓图
  • Vue中注意target和currentTarget的使用
  • 并发-4-volatile
  • [SDOI2009]Elaxia的路线
  • ES学习笔记(12)--Symbol
  • Redis 中的布隆过滤器
  • json字符串 转换为数组
  • 用mpvue开发微信小程序
  • hadoop副本放置策略
  • 【逆序对】N*M Puzzle / Simple Puzzle
  • JavaCV cvEstimateRigidTransform函数使用心得
  • 10.17_T1 平津战役
  • CentOS7简单部署NFS
  • Cumulo 的 ClojureScript 模块已经成型
  • ES6核心特性
  • Java 内存分配及垃圾回收机制初探
  • java多线程
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Wamp集成环境 添加PHP的新版本
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 区块链分支循环
  • 数组的操作
  • 思否第一天
  • 小而合理的前端理论:rscss和rsjs
  • 昨天1024程序员节,我故意写了个死循环~
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # .NET Framework中使用命名管道进行进程间通信
  • #if和#ifdef区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (6)STL算法之转换
  • (ros//EnvironmentVariables)ros环境变量
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (数据结构)顺序表的定义
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)appium-desktop定位元素原理
  • **PHP分步表单提交思路(分页表单提交)
  • . Flume面试题
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET DataGridView数据绑定说明
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [ASP]青辰网络考试管理系统NES X3.5
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)