【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前后有一个条件的列不是索引,查询中将不使用索引。

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

相关推荐
战南诚21 分钟前
深分页问题
数据库·mysql
2301_7873124322 分钟前
Vue.js中Patch过程处理Teleport组件挂载位置的特殊逻辑
jvm·数据库·python
dfdfadffa32 分钟前
Golang Gin怎么做JWT登录认证_Golang Gin JWT教程【实用】
jvm·数据库·python
m0_7364393036 分钟前
C#怎么实现MVVM模式 C#如何在WPF中使用MVVM设计模式分离视图和逻辑【架构】
jvm·数据库·python
名字不好奇41 分钟前
RAG进阶:下一代RAG怎么玩?
数据库·人工智能
zhoutongsheng43 分钟前
Chromebook适合用什么HTML函数工具_轻量化方案汇总【汇总】
jvm·数据库·python
万事大吉CC1 小时前
【4】深入剖析 Django 之 MTV:ORM 系统核心原理
数据库·python·oracle·django·sqlite
ByteX1 小时前
MySQL 联合索引创建效果评估
数据库·mysql
逸Y 仙X1 小时前
文章二十五:ElasticSearch 分页查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
今天长肉了吗1 小时前
风控指标平台实战:大数据量下如何设计分批处理
开发语言·数据库·python