【Mysql】三大组合拳 (索引、锁、事务) 之 重拳--“索引”

1、什么是索引

索引是一种帮助数据库系统提高查询效率的数据结构。它通过按照特定的规则对数据进行排序和存储,从而加快数据的检索速度。

索引的优点

  • 大大加快数据查询速度

索引的缺点

  • 维护索引需要耗费数据库资源
  • 索引需要占用磁盘空间
  • 数据的增删改操作需要维护索引,影响操作速度

2、索引分类

  • 主键索引:设定为主键后数据库会自动建立索引,InnoDB为聚簇索引
  • 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 复合索引:一个索引包含多个列
  • 全文索引:全文索引类型为FULLTEXT,支持值的全文查找,允许在这些索引列中插入重复值和空值,但只有MyISAM存储引擎支持全文索引。

(注:MyISAM存储引擎支持全文索引,而InnoDB存储引擎也在MySQL5.6版本之后开始支持全文索引)

3、索引的基本操作

主键索引

在创建表时,可以通过指定一个列作为主键来自动创建主键索引。例如:

sql 复制代码
CREATE TABLE t_user (
    id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20)
);

这样就可以自动创建一个名为 "PRIMARY" 的主键索引。要查看表中的索引,可以使用如下命令:

sql 复制代码
SHOW INDEX FROM t_user;

单列索引

在创建表时,可以通过在列定义之后使用 KEY 关键字来创建单列索引。如果要在建表后创建单列索引,可以使用 CREATE INDEX 语句。例如:

sql 复制代码
-- 建表时创建单列索引
CREATE TABLE t_user (
    id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20),
    KEY (name)
);
​
-- 建表后创建单列索引
CREATE INDEX nameindex ON t_user(name);

要删除索引,可以使用 DROP INDEX 语句:

sql 复制代码
-- 删除索引
DROP INDEX nameindex ON t_user;

这样可以有效地创建和删除单列索引。

唯一索引

在建表时创建唯一索引,可以在列定义后使用 UNIQUE 关键字来创建唯一索引。如果是在建表后创建唯一索引,可以使用 CREATE UNIQUE INDEX 语句。例如:

sql 复制代码
-- 建表时创建唯一索引
CREATE TABLE t_user (
    id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20),
    UNIQUE (name)
);
​
-- 建表后创建唯一索引
CREATE UNIQUE INDEX nameindex ON t_user(name);

这样可以有效地创建唯一索引。

复合索引

在建表时创建复合索引,可以在列定义后使用 KEY 关键字来创建复合索引。如果是在建表后创建复合索引,可以使用 CREATE INDEX 语句。例如:

sql 复制代码
-- 建表时创建复合索引
CREATE TABLE t_user (
    id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20),
    age INT,
    KEY name_age_index (name, age)
);
​
-- 建表后创建复合索引
CREATE INDEX name_age_index ON t_user(name, age);

这样可以有效地创建复合索引。

4、索引什么情况下会失效?

在以下情况下,可能无法充分利用索引:

  • 当查询语句中使用LIKE关键字进行查询时,如果匹配字符串的第一个字符为"%",索引通常不会被使用。如果"%"不是在第一个位置,索引会被使用。

  • 当查询语句中使用多列索引时,只有在查询条件中使用了这些字段中的第一个字段,索引才会被使用。

  • 当查询语句中使用OR关键字时,如果OR前后的两个条件的列都是索引,则查询中将使用索引。但如果OR前后有一个条件的列不是索引,查询中将不使用索引。

以上情况都会影响索引的使用效果,因此在设计数据库时,需要考虑这些因素以便进行优化。

相关推荐
zhangren024685 分钟前
Laravel8.x核心特性全解析
vue.js·spring boot·mysql
Java源码jdk8 分钟前
基于javaweb和mysql的springboot校园二手书交易管理系统(java+springboot+vue+elementui+layui+mysql)
java·spring boot·mysql
无名-CODING12 分钟前
Docker 部署 Redis:小白一键安装、配置与迁移教程
数据库·redis·bootstrap
IMPYLH24 分钟前
Linux 的 env 命令
linux·运维·服务器·数据库
fobwebs30 分钟前
如何通过phpmyadmin指令来优化数据库表,给数据库“减肥”。
数据库·wordpress·数据库优化·phpmyadmin
syinfo30 分钟前
oracle使用PLSQL导出表数据
数据库·oracle
客梦32 分钟前
数据库基础
数据库·笔记
老苏畅谈运维35 分钟前
Oracle AI Database 26ai 安装实战
数据库·oracle·oracle 26ai
Rick199335 分钟前
SQL优化
数据库·sql
沪漂阿龙36 分钟前
掌握MySQL这些函数,SQL水平直接起飞!
数据库·sql·mysql