SQL - 索引

  • 索引本质上是数据库引擎用来快速查找数据的数据结构,可以显著提高查询的性能,为了加快运行较慢的查询。

  • 创建索引

    • 默认索引

      • create index 索引名 on 表名 (列名);
      • 通过对列名进行创建索引,在查询的时候,数据库就能通过索引找到匹配的那些行,适用于支持高效的范围查询。
      sql 复制代码
      -- 默认索引
      create index idx_points on customers (points);
      select customer_id
      from customers
      where points>1000;
    • 前缀索引

      • create index idx_last_name on customers (last_name(5));
      • 对于长字符串列,建议使用前缀索引来节省存储空间和提高查询效率。前缀索引只索引字符串的前几个字符。
      sql 复制代码
      --前缀索引
      create index idx_last_name on customers (last_name(5));
      select customer_id
      from customers
      where last_name like 'boa%';
    • 全文索引

      • create fulltext index idx_title_body on posts(title,body);
      • 全文索引可以在应用程序里打造快速强大的搜索引擎,适用于需要高效文本搜索,如文章,博客等。
      sql 复制代码
      -- 全文索引
      create fulltext index idx_title_body on posts(title,body);
      select *,match(title,body) against ('react redux')
      from posts
      -- where match (全文索引的列名(所有)) against(关键词)
      
      -- where match(title,body) against ('react redux')	
      -- 表示包含 'react' 或 'redux' 的记录
      
      where match(title,body) against('react -redux +form' in boolean mode) 
      -- 表示包含 'react' ,不包含 'redux',必须包含'form' 的记录
    • 复合索引

      • create index idx_state_points on customers (state,points);
      • 复合索引也叫组合索引,就是对多个列建立一个索引,遵循最左前缀原则,适用于需要在多个列进行查询的场景,显著提高查询效率。
      sql 复制代码
      -- 复合索引
      create index idx_state_points on customers (state,points);
      explain select customer_id
      from customers
      where state='ca' and points>1000;
  • 删除索引

    • drop index idx_state on customers;
  • 使用索引排序

    • 使用索引对数据进行排序,当你在添加索引时,MySQL会获取该列中的所有值,对其排序,并将它们存储在索引中。
  • 覆盖索引

    • 一个包含所有满足查询需要的数据的索引,数据库可以直接从索引中获取数据,避免了回表操作,显著提高查询性能。
  • 维护索引

    • 索引可以极大地提高查询的性能,但要注意在创建新索引之前,要先查看现有索引,否则容易产生"重复索引"和"多余索引"。
    • "重复索引",指同一组列上且顺序一致的索引,对于该索引应删除。
    • "多于索引",指多个索引的前缀列相同,或复合索引中包含了主键的索引,对于该索引应合并。
相关推荐
【非典型Coder】30 分钟前
Statement和PreparedStatement区别
数据库
m0_736927041 小时前
想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
java·数据库·sql·postgresql
lang201509281 小时前
MySQL 8.0.29 及以上版本中 SSL/TLS 会话复用(Session Reuse)
数据库·mysql
望获linux2 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
清和与九3 小时前
binLog、redoLog和undoLog的区别
数据库·oracle
望获linux3 小时前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统
总有刁民想爱朕ha3 小时前
Python自动化从入门到实战(24)如何高效的备份mysql数据库,数据备份datadir目录直接复制可行吗?一篇给小白的完全指南
数据库·python·自动化·mysql数据库备份
朝九晚五ฺ3 小时前
【Redis学习】持久化机制(RDB/AOF)
数据库·redis·学习
虾说羊3 小时前
sql中连接方式
数据库·sql
liweiweili1263 小时前
Django中处理多数据库场景
数据库·python·django