首页 > 数据库 >MYSQL单列索引和组合索引的对比分析

MYSQL单列索引和组合索引的对比分析

时间:2023-09-14 14:34:05浏览次数:37  
标签:week item 单列 MYSQL 索引 time MySQL

单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。

组合索引:即一个索包含多个列。

怎么选择:

  • 如果查询where条件只有一个,完全可以用单列索引,这样的查询速度较快,索引也比较瘦身。
  • 如果业务场景是需要经常查询多个组合列,不要试图分别基于单个列建立多个单列索引(因为虽然有多个单列索引,但是MySQL只能用到其中的那个它认为似乎最有效率的单列索引)。这是因为当SQL语句所查询的列,全部都出现在复合索引中时,此时由于只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。
week_item是星期,begin_time是开始时间,end_time是结束时间,如果现在表中存在10000条记录,要查询where week_item = 6

week_item上增加单列索引,直接就返回结果集,那么此时的查询效率是非常快

更换搜索条件:where week_item = 6 and begin_time = '09:00' and end_time = '10:00'

由于建立了week_item列的索引,与执行表的完全扫描相比,MySQL的效率提高了很多,但要求MySQL扫描的记录数量仍旧远远超过了实际所需要的。所以对剩下的结果集还是需要进行全部扫描比较,那如果此时说可以在begin_time和 end_time上再增加单列索引,那么这就涉及到上面说的了:因为虽然有多个单列索引,但是MySQL只能用到其中的那个它认为似乎最有效率的单列索引,其实这个时候只会用到一个索引。
为了提高搜索效率,需要考虑运用多列索引。如果为week_item 、begin_time 和end_time 这三个列创建一个多列索引,MySQL只需一次检索就能够找出正确的结果。

如果在week_item、begin_time、end_time 这三个列上分别创建单列索引,效果是否和创建一个week_item、begin_time、end_time的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于week_item、begin_time、end_time这三个列上的多列索引

注意事项:

  • 建立联合索引,谨防最左前缀索引失效问题;
  • 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以在数据库设计时不要让字段的默认值为NULL;
  • 对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作;
  • MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要,最好给这些列创建复合索引。
  • 一般情况下不鼓励使用like操作;
  • 不要在列上进行运算,会导致索引失效;
  • 不使用NOT IN和<>操作。

标签:week,item,单列,MYSQL,索引,time,MySQL
From: https://www.cnblogs.com/beatle-go/p/17702401.html

相关文章

  • MySQL篇:第三章_详解DQL语言
    DQL语言的学习基础查询一、语法:SELECT要查询的东西【FROM表名】;类似于Java中:System.out.println(要打印的东西);特点:①通过select查询完的结果,是一个虚拟的表格,不是真实存在②要查询的东西可以是常量值、可以是表达式、可以是字段、可以是函数二、特点1、查询......
  • mysql事务回滚
    前几天发现程序有个Bug:使用JPA已经设置了回滚,但抛出异常后,提交的事务并没有回滚。刚开始以为是JPA使用问题,debug了近2个多小时竟然找不到原因。后来上网查了一下,才发现不是程序问题(坑爹啊,看来自己对mysql还是不熟),是数据库表问题(JPA自动建表)。原因如下:mysql建表时如果指定ENG......
  • SQL基础总结(十):索引
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------对于以下列创建索引是恰当的,这些列经常被:查询、排序、分组、联结、用来计算顺序统计(MIN、MAX或中值)。对于......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • 【小睿的ML之路】Pandas索引与计算
    importpandasfood_info=pandas.read_csv("food_info.csv",encoding="gbk")print(food_info)名称价格(元)糖分(g)重量(kg)含水量(mg)0苹果2002010301香蕉1005030702梨102030......
  • N天爆肝数据库——MySQL(2)
    (N天爆肝数据库——MySQL(2))链接:link这是csdn专栏链接,大家可以看一看,提提意见本篇文章,主要对DMLDQL进行知识总结和学习。期待和大家一起学习进步。DML-介绍DML(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELET......
  • mysql 的用法
    MySQL是一个由瑞典MySQLAB公司开发的关系型数据库管理系统,属于Oracle旗下产品。它是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS应用软件之一。关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL......
  • MySQL 和 Python:无缝结合的数据库应用
    MySQL和Python都是广泛应用于软件开发的重要工具。MySQL是一种强大的关系型数据库管理系统,而Python则是一种灵活的高级编程语言。它们之间的紧密集成为开发人员提供了强大的数据存储和操作能力。本文将探讨MySQL和Python之间的关系,并提供一些示例代码来演示如何在Python......
  • MySQL体系架构
    1.背景刚入行时,大部分Java工程师对MySQL停留在一个黑盒的认识,包括我自己。最近一段时间,这几年通过项目实践与不断反思,对MySQL的新认知提升到一个新层次,供大家分享。下图是初始阶段的认识,就是对数据库建库、建表、建索引,然后执行增删改查操作。2.数据库驱动大家都知道,我们如......
  • Mysql 主从复制
    一、设计思路准备两个5.7版本的MySQL,一个用作主数据库,另一个用作从数据库。把主数据库做为写入数据库,从数据库作为读数据库。二、具体步骤准备两台数据库,可以本地配置两台Mysql数据库或者局域网两台Mysql数据库。1.先把你的mysql目录拷贝复制一份,复制出来的那份取名为mysql-......