MySql索引和索引创建策略

MySQL索引是提高查询效率的重要手段之一。建立正确的索引可以大大优化查询性能,而错误的索引设计则可能会导致查询性能下降。

一、什么是索引?

索引是对数据库表中一个或多个列的值进行排序的数据结构,通过索引可以快速定位到表中满足条件的行。可以将索引比喻成是一本书的目录,可以快速地找到需要的内容。

有两种主要的索引类型:B-Tree索引和哈希索引。B-Tree索引适合于等值查询和范围查询,而哈希索引适合于快速索引访问,但只支持等值查询。

二、索引创建策略

1.根据查询频率建立索引

索引会提高查询速度,但同时会增加写入数据的时间,因此要根据查询的频率来选择建立索引的列,必须避免在不需要的列上创建索引,这将极大程度地影响性能。

根据查询频率来设计索引的原则是:对于经常执行的查询语句,应该尽量在WHERE子句中包含所有必要的列,以便利用多个列的索引来提高查询速度。

例如,假设有一个用户表,其中用户名是经常被查询的列,那么应该为这个列建立索引。

CREATE INDEX idx_username ON user(username);

2.根据列的基数(基数表示列中唯一值的数量)建立索引

如果某个列的基数很小,则用于搜索的索引的效率可能反而比不用索引更慢。相反,如果某个列的基数很高,则用于搜索的索引的效率可能会更快。

因此,根据列的基数来建立索引的策略是:基数低的列不适合建立索引,基数高的列适合建立索引。

例如,假设用户表中有一个列代表用户的关注领域,这个列中可能只有很少的几个不同值,那么为这个列建立索引可能会影响查询效率。

3.根据LIKE查询的位置建立索引

对于LIKE %text%,如:%123%查询语句要使用全文索引。对于LIKE text%或LIKE %text,在text前面建立索引可以加快该查询的速度。

例如,假设有一个文章表,其中有一个列代表文章的标题,那么如果需要进行模糊查询,可以为这个列建立前缀索引。

CREATE INDEX idx_title ON article(title(20));

四、索引的优缺点

1.优点

(1)可以提高查询速度,对于有大量数据的表,查询性能的提升非常明显。

(2)可以加速表与表之间的关联,例如在联表查询时,如果建立了正确的索引,可以大大加快查询速度。

(3)可以加速排序,利用排序时创建的索引可以很快的查询到需要的数据,避免类似于 SELECT * FROM table ORDER BY column这样的查询,提高查询速度和效率。

2.缺点

(1)会占用磁盘空间,因为索引是一个数据结构,索引文件会占用一定的磁盘空间。

(2)会影响写入性能,因为在写入数据的时候,需要维护索引结构,所以写入性能会下降。

(3)会增加查询优化器的选择时间,MySQL的查询优化器会根据查询条件以及索引的分布情况来选择最优的查询计划,而索引的增加往往会带来更多的选择,所以会增加查询优化器的选择时间。

总之,正确的索引设计能够大大提高查询性能,但是错误的索引设计会使查询性能下降甚至崩溃,在设计索引时,需要根据不同的场景、查询特征来选择合适的建索引策略。

下面是示例说明:

  1. 为用户表中的 username 列创建索引

CREATE INDEX idx_username ON user(username);

  1. 为文章表中的 title 列创建前缀索引

CREATE INDEX idx_title ON article(title(20));

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySql索引和索引创建策略 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MySQL函数详解

    MySQL函数是一种可以被调用的特定代码段,它可以接收输入参数并返回处理结果。MySQL中包含了多种内置函数,这些函数可以被用于各种不同的场景,例如计算、格式化、比较等。下面是MySQL函数的种类以及作用和使用范围的详细介绍: 数学函数 MySQL中内置了多种用于数学计算的函数,例如ABS、CEILING、FLOOR、ROUND、TRUNCATE等。这些函数…

    MySQL 2023年3月9日
    00
  • 浅谈MySQL数据库中日期中包含零值的问题

    首先我们需要明确MySQL中日期类型有哪些,常用的包括DATE、DATETIME、TIMESTAMP和YEAR。这些类型的区别主要在于精度和范围,以及对于时区的处理。 我们先看一下包含零值的情况,比如“0000-00-00”这个日期,它即不是一个有效的日历日期,也不是一个NULL值。这种情况下,我们需要考虑到MySQL的严格模式以及对于该日期的处理方式。下面…

    database 2023年5月22日
    00
  • Redis 保护模式

    默认 redis 启用了保护模式,即如果是远程链接不能进行 CRUD 等操作,如果进行该操作报错如下 (error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentica…

    Redis 2023年4月13日
    00
  • (转载)Redis使用缓存合理性

    热点数据,缓存才有价值 对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大。 对于热点数据,比如我们的某IM产品,生日祝福模块,当天的寿星列表,缓存以后可能读取数十万次。再举个例子,某导航产品,我们将导航信息,缓存以后可能读取数百万次。 频繁修改的数据,看情况考虑使用缓存 数据更新前至少读取两次,缓存才有意义。这个是最…

    Redis 2023年4月12日
    00
  • 六条比较有用的MySQL数据库操作的SQL语句小结

    我来为你详细讲解“六条比较有用的MySQL数据库操作的SQL语句小结”的完整攻略。 一、SELECT语句 1.1 SELECT基础语法 SELECT语句是MySQL最常见的语句之一,用于从一个或多个表格中检索数据。其基本语法为: SELECT 列名 FROM 表名; 其中,“列名”表示需要查询的字段列的名称,可以是单个列名,也可以是多个列名,用逗号隔开。而“…

    database 2023年5月19日
    00
  • SQL语句练习实例之三——平均销售等待时间

    这里是SQL语句练习实例之三——平均销售等待时间的完整攻略。 问题描述 假设我们有一个销售系统,里面有两张表: sales 表,包含销售的信息,包括销售的时间、销售员和销售的数量等; salesman 表,包含销售员的信息,包括销售员的编号和姓名等。 现在需要我们统计每个销售员的平均销售等待时间,即从销售员服务的第一个客户进入销售系统开始计算,到最后一个客户…

    database 2023年5月21日
    00
  • Go语言编译程序从后台运行,不出现dos窗口的操作

    首先,Go语言的编译器可以在后台运行,并且不会出现DOS窗口,这是因为可以使用Go语言的官方IDE和其他第三方开发环境,如Visual Studio Code或Sublime Text等来进行编译并运行程序。 以下是两个示例说明: 使用Goland IDE Goland是一款强大的Go语言开发IDE,可以让开发人员编写,调试和测试Go语言程序。在编译和运行程…

    database 2023年5月22日
    00
  • Impala和hBASE的区别

    Impala和hBASE是两种不同的大数据处理技术。Impala是Apache Hadoop生态系统中的一个查询引擎,可以让用户用SQL语言进行复杂的查询分析。而hBASE是一个分布式的、高性能的NoSQL数据库。下面我们来详细讲解这两种技术的区别。 Impala Impala的优势 Impala作为一种大数据查询引擎,有以下几个特点: 快速:Impala处…

    database 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部