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

mysql索引的用法

十分想念顺店杂可。。。

MySQL 索引是提高查询效率的关键工具,类似于书籍的目录,能快速定位数据位置。以下是其常用使用方法,包含创建、类型、使用场景及注意事项:

一、索引的基本类型及创建方法

MySQL 支持多种索引类型,需根据业务场景选择:

1. 主键索引(PRIMARY KEY)
  • 特点:唯一标识表中记录,自动创建,一个表只能有一个主键,值不能为空(NOT NULL)。
  • 创建方式:
    -- 建表时指定
    CREATE TABLE user (id INT PRIMARY KEY,  -- 主键索引name VARCHAR(50)
    );-- 已有表添加
    ALTER TABLE user ADD PRIMARY KEY (id);
    

2. 唯一索引(UNIQUE)
  • 特点:确保列值唯一(允许 NULL,但 NULL 只出现一次),可用于防止重复数据。
  • 创建方式:
  • -- 建表时指定
    CREATE TABLE user (id INT,phone VARCHAR(20) UNIQUE,  -- 唯一索引PRIMARY KEY (id)
    );-- 已有表添加
    CREATE UNIQUE INDEX idx_phone ON user(phone);
    -- 或
    ALTER TABLE user ADD UNIQUE idx_phone (phone);
    
3. 普通索引(INDEX)
  • 特点:最基础的索引,无唯一性限制,用于加速查询。
  • 创建方式:
    -- 建表时指定
    CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(50),INDEX idx_name (name)  -- 普通索引
    );-- 已有表添加
    CREATE INDEX idx_name ON user(name);
    -- 或
    ALTER TABLE user ADD INDEX idx_name (name);
    
4. 复合索引(多列索引)
  • 特点:对多个列联合创建索引,遵循 “最左前缀原则”(查询需包含最左列才可能生效)。
  • 适用场景:频繁按多列组合查询(如WHERE a=? AND b=?)。
  • 创建方式:
    -- 对name和age创建复合索引
    CREATE INDEX idx_name_age ON user(name, age);-- 有效查询(包含最左列name)
    SELECT * FROM user WHERE name='张三' AND age=20;  -- 索引生效
    SELECT * FROM user WHERE name='张三';  -- 索引生效(仅用name部分)-- 无效查询(不包含最左列name)
    SELECT * FROM user WHERE age=20;  -- 索引不生效
    
5. 全文索引(FULLTEXT)
  • 特点:用于全文搜索(如文章内容、长文本),仅支持CHARVARCHARTEXT类型,MyISAM 和 InnoDB(5.6+)支持。
  • 创建方式:
    -- 建表时指定
    CREATE TABLE article (id INT PRIMARY KEY,content TEXT,FULLTEXT INDEX idx_content (content)  -- 全文索引
    );-- 查询(需用MATCH...AGAINST语法)
    SELECT * FROM article 
    WHERE MATCH(content) AGAINST('数据库 索引' IN BOOLEAN MODE);
    

二、索引的使用场景

  1. 查询频繁的列:对WHEREJOIN(关联条件)、ORDER BYGROUP BY涉及的列创建索引。
    例:SELECT * FROM user WHERE name='张三' → 对name建索引。

  2. 区分度高的列:如身份证号(几乎唯一)比性别(只有 2 个值)更适合建索引,区分度低的索引效率差。

  3. 避免索引失效:以下情况索引可能不生效,需特别注意:

    • 索引列使用函数:WHERE SUBSTR(name, 1, 1)='张'(可用复合索引或生成列索引优化)。
    • 模糊查询以%开头:WHERE name LIKE '%三'LIKE '张%'则索引生效)。
    • 索引列参与运算:WHERE id+1=10(应改为WHERE id=9)。
    • OR连接非索引列:WHERE name='张三' OR age=20(若age无索引,整个查询可能全表扫描)。
    • 隐式类型转换:如phone是字符串,查询WHERE phone=13800138000(应加引号'13800138000')。

三、索引的维护

  1. 删除索引

    -- 删除普通索引
    DROP INDEX idx_name ON user;-- 删除主键索引(需先移除自增等属性)
    ALTER TABLE user DROP PRIMARY KEY;
    
  2. 查看索引

    -- 查看表中所有索引
    SHOW INDEX FROM user;
    
  3. 重建索引:当索引碎片较多(如频繁删除 / 更新),可重建优化性能:

    -- 重建表所有索引(InnoDB有效)
    ALTER TABLE user ENGINE=InnoDB;
    

四、最佳实践

  • 不要过度索引:索引会占用存储空间,且降低插入 / 更新 / 删除的效率(需维护索引结构)。
  • 复合索引顺序:将查询频率高、区分度高的列放在前面(最左前缀原则)。
  • 小表无需索引:数据量少时(如几百行),全表扫描可能比索引查询更快。

合理使用索引能显著提升查询性能,但需结合业务场景设计,避免盲目创建。

http://www.xdnf.cn/news/17215.html

相关文章:

  • DSP的CLA调试技巧
  • 无人机航拍数据集|第5期 无人机高压输电线铁塔鸟巢目标检测YOLO数据集601张yolov11/yolov8/yolov5可训练
  • Redis的分布式序列号生成器原理
  • GoogLeNet训练
  • 【数论】素数
  • 盲盒抽卡机小程序系统开发:打造个性化娱乐新平台
  • C语言基础_排序算法和二分法查找
  • Android 之 Kotlin中的符号
  • Unity模型显示在UI上
  • 以此芯p1芯片为例研究OpenHarmony上GPU (Vulkan) 加速在深度学习推理中的价值
  • 点赞服务完整消息流转过程详解(原方案,未使用Redis)
  • 学习嵌入式之硬件——ARM体系
  • 昇思+昇腾开发板+DeepSeek模型开发与适配
  • 豆包新模型与PromptPilot工具深度测评:AI应用开发的全流程突破
  • 自然语言处理基础—(1)
  • Java 工具类的“活化石”:Apache Commons 核心用法、性能陷阱与现代替代方案
  • linux-系统性能监控
  • [特殊字符]企业游学 | 探秘字节,解锁AI科技新密码
  • WebSocket 通信与 WebSocketpp 库使用指南
  • Java 大视界 -- 基于 Java 的大数据实时流处理在工业物联网设备故障预测与智能运维中的应用(384)
  • 【STL源码剖析】从源码看 vector:底层扩容逻辑与内存复用机制
  • golang的map
  • 【Linux】重生之从零开始学习运维之主从MGR高可用
  • 【C++】unordered系列容器使用及封装
  • WebStorm转VSCode:高效迁移指南
  • QML开发:QML中的基本元素
  • 项目设计模式草稿纸
  • Docker概述
  • chromedp 笔记
  • Prometheus监控学习-安装