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

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.lryc.cn/news/611735.html

相关文章:

  • Suno API V5模型 python源码 —— 使用灵感模式进行出创作
  • 国产3D大型装配设计新突破①:图纸打开设计双加速 | 中望3D 2026
  • rsync 的三种常见用法
  • 学习bug
  • jmm 指令重排 缓存可见性 Volatile 内存屏障
  • word2vector细致分解(CBOW, SKIP_GRAM, 层次soft Max, 负采样)
  • linux创建虚拟内存
  • Linux Vim 常用快捷键
  • Java学习第一百一十部分——CI/CD
  • 【完整源码+数据集+部署教程】爬行动物异常检测系统源码和数据集:改进yolo11-GhostDynamicConv
  • 一个php 连sqlserver 目标计算机积极拒绝,无法连接问题的解决
  • CVE-2021-30661、CVE-2021-30665、CVE-2021-30666
  • 浅谈对linux进程池的理解
  • back_inserter 详解
  • 快手小店客服自动化回复
  • 基于 Jenkins Pipeline 实现 DITA 文档自动化构建与发布(开源方案)
  • 基于模式识别的订单簿大单自动化处理系统
  • 【Redis】hash哈希,List列表
  • 在Jetson AGX Orin上将docker目录挂载到大容量硬盘目录
  • 【C语言】文件操作全解析
  • c++ template in .h and .cpp
  • 快速删除 `node_modules`
  • 2025面试题(10)
  • Shader开发(八)创建第一个三角形
  • 微信小程序多媒体功能实现
  • 微信小程序初次运行项目失败
  • 深入理解SpringMVC DispatcherServlet源码及全流程原理
  • 开发教育全链路管理系统 + 微信小程序,为各类教育主体注入数字化动力!
  • [LVGL] 配置lv_conf.h | 条件编译 | 显示屏lv_display
  • 微信小程序中使用TensorFlowJS从环境搭建到模型训练及推理模型得到预测结果