首页 > 其他分享 >复合索引和最左前缀原则

复合索引和最左前缀原则

时间:2024-03-12 15:24:57浏览次数:28  
标签:前缀 复合 查询 索引 date WHERE order

复合索引

复合索引是根据多个列创建的数据库索引。它们对于优化涉及这些列的查询性能非常有用。在创建复合索引时,这些列的顺序至关重要,因为它决定了数据库如何利用该索引。

列的顺序

确定复合索引中列的顺序时,应考虑以下因素:

  • 查询模式:考虑哪些列经常一起出现在WHERE子句中。
  • 选择性:选择性是指一列中不同值的数量。通常,选择性较高的列应放在索引的前面。

最左前缀原则

最左前缀原则指出,查询必须使用复合索引中从最左侧开始的一个或多个列。数据库引擎将从索引的最左边开始匹配这些列。

例如:

假设有一个复合索引 (A, B, C),以下是一些查询条件和它们是否能有效利用索引的例子:

  • WHERE A = 1:✅ 可以使用索引。
  • WHERE A = 1 AND B = 2:✅ 可以使用索引。
  • WHERE A = 1 AND B = 2 AND C = 3:✅ 可以使用索引。
  • WHERE B = 2:❌ 不能充分利用索引。
  • WHERE B = 2 AND C = 3:❌ 不能充分利用索引。
  • WHERE A = 1 AND C = 3:⚠️ 部分使用索引,但不是最优。

如何确定复合索引的列顺序?

为了确定最优的复合索引列顺序,你需要:

  1. 分析常见的查询模式。
  2. 评估涉及的列的选择性。
  3. 使用查询执行计划工具来测试不同索引策略对性能的影响。

示例

考虑一个orders表,我们常常需要根据customer_idorder_date来检索数据。创建如下索引可以优化这类查询:

CREATE INDEX idx_customer_id_order_date ON orders (customer_id, order_date);

这个索引适用于:

  • 根据 customer_id 过滤订单。
  • 根据 customer_id 和 order_date 过滤订单。

但它不适用于只基于 order_date 进行的查询,因为 order_date 不是最左边的列。

标签:前缀,复合,查询,索引,date,WHERE,order
From: https://www.cnblogs.com/viazure/p/18068371

相关文章

  • 如何建立一个好的索引
    理解索引的类型:聚集索引:表中数据行的物理排序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引。非聚集索引:索引包含键值和指向存储数据行的指针,而不是数据本身。选择正确的列进行索引:选择性高的列:索引的选择性是指不同值的数量与表中行数的比率。高选择性意味着索......
  • MySQL(八):MySQL之索引
    1、MySQL索引及作用MySQL官网:索引(Index)是帮助MySQL高效获取数据的数据结构。索引是数据结构。一个索引就是一个B+树,加快数据查询的速度。一个select查询语句在执行过程中一般最多能使用一个辅助索引,即使在where条件中用了多个辅助索引。2、InnoDB存储引擎支持的常见索......
  • mysql 索引
    索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系的数据结构,通过索引查询可以提高查询的效率。举个例子:把一个数据表当做一个图书馆,数据表中的一行数据当做一本书,在没有索引的情况下,想要找某一本书时,几乎需要将整个图书馆的书找一遍。当建立了索引后,就......
  • Lucene轻量级搜索引擎,真的太强了!!!Solr 和 ES 都是基于它
    一、基础知识1、Lucene是什么Lucene是一个本地全文搜索引擎,Solr和ElasticSearch都是基于Lucene的封装Lucene适合那种轻量级的全文搜索,我就是服务器资源不够,如果上ES的话会很占用服务器资源,所有就选择了Lucene搜索引擎2、倒排索引原理全文搜索的原理是使用......
  • 利用JavaRestClient依赖使用java操作索引库
    引入依赖<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></depend......
  • Mysql如何给字符串添加索引(前缀索引)
    在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢看看下面这条sqlselect*fromuserwhereemail='[email protected]'如果我们不添加索引,肯定是要进行全表扫描的,那么我们如何添加呢有两种方式a......
  • 蓝桥杯算法集训 - Week1:二分、前缀和、差分算法
    蓝桥杯算法集训-Week1本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、二分查找二分算法原理复习参考:二分查找-Hello算法Ⅰ、二分模板boolcheck(intx){/*...*/}//检查x是否满足某种性质//区间[l,r]被划分......
  • 数据库中的索引
    目录1、概述MySQL索引是一种提高查询效率的重要手段,它能够快速定位需要的数据,从而减少查询的开销。MySQL支持多种索引类型,每种类型都有其特点和适用场景。本文将介绍MySQL常见的索引类型及其特点。2、索引种类MySQL常见的索引种类有普通索引、唯一索引、全文索引、单列索引、......
  • abc284F 前缀+逆序+后缀
    题面:给一个长度为2n的字符串T,问是否存在长度为n的字符串S,满足:T=S的前缀+整串S逆序+S的后缀。范围:n<=1e6思路:字符串哈希,枚举S的起点逐一判断,如果前i个字符加后n-i个字符组成的长为n的字符串,正好和中间串的逆序相同,则为解。#include<bits/stdc++.h>usingnamespacestd;......
  • MySQL查询优化方案汇总(索引相关)
    索引相关类型隐式转换大坑**字段filed1是varchar类型,且加了索引,如果wherefiled1=123;type可能是all,因为123是数字类型,mysql内部会用函数做隐式转换,用了函数,索引就失效了。**大数据深度分页,用主键selectfield1,field2fromtablelimit100000,10;selectfield1,fiel......