当前位置: 首页 > 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.dtcms.com/a/317921.html

相关文章:

  • 录音智能转写:一键查看清单,下载功能如何实现?
  • AI Infra与LLM的联系与差异
  • django之中间件
  • Apache Flink 的详细介绍
  • 服务器宕机与服务崩溃排查及解决方案
  • Aop中的相关术语
  • Windows 操作系统 - Windows 修改颜色(界面元素颜色)
  • SpringBoot 整合Langchain4j 对接主流大模型实战详解
  • JAVA无人系统台球茶室棋牌室系统支持H5小程序APP公众号源码
  • 初识浏览器扩展,搭建你的“秘密基地”
  • 基于2025年《Science》期刊论文的科研图表Python绘制分析
  • CDP集群中通过Hive外部表迁移HBase数据的操作记录
  • 使用 Apache DolphinScheduler 构建和部署大数据平台,将任务提交至 AWS 的实践经验
  • 常用排序方法
  • Redis的分布式序列号生成器原理
  • Vue Vant使用
  • CEH、OSCP、CISP、CISSP 四大网络安全认证攻略
  • o2o 商城系统数据分析管理系统模块设计
  • ZYNQ实现FFT信号处理项目
  • Godot ------ 初级人物血条制作02
  • SpringCloud -- elasticsearch(二)
  • wordpress网站的“管理员邮箱地址”有什么用?
  • CVE-2021-30661、CVE-2021-30665、CVE-2021-30666
  • c++类常用默认成员函数细节分析
  • Godot ------ 初级人物血条制作01
  • linux-系统性能监控
  • 如何测试一个机器是大端还是小端
  • cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)
  • 达梦数据库日常运维命令
  • Node.js从入门到精通完整指南