代码编织梦想

在数据库优化中,创建索引是提高查询效率的一种重要手段,也是许多程序员的头疼问题。如果你也有同样的困扰,那么就跟我一起来看看如何创建更合适的MySQL索引吧!

  • MySQL索引的分类

在开始学习如何创建MySQL索引之前,我们先来了解一下常见的索引类型:

(1)普通索引:没有任何限制,是最基本的索引。

(2)唯一索引:列值必须唯一,允许为null。

(3)主键索引:一张表只有一个主键,不允许为null。

(4)联合索引:在多个字段上创建索引,查询效率更高。

(5)全文索引:用来匹配字符串文本中关键字。

二   哪些字段适合创建索引?

  1.  频繁查询的字段适合创建索引。对于一张表的字段来说,有冷热之分,很明显那些频繁使用的字段更适合为它创建索引。例如,对于用户表来说,手机号和用户名可能会被频繁查询,因此适合创建索引。

代码示例:

ALTER TABLE `user` ADD INDEX idx_phone (phone);
ALTER TABLE `user` ADD INDEX idx_username (username);
  • 在where和on条件出现的字段优先创建索引。为什么不是在select后面出现的字段优先创建索引?因为查询SQL会先匹配on和where条件的字段,具体的匹配顺序是这样的:from > on > join > where > group by > having > select > distinct > order by > limit。因此,在这些条件中出现的字段更适合创建索引。

代码示例:

SELECT * FROM `order` WHERE `status` = 1 AND `create_time` BETWEEN '2022-01-01' AND '2022-01-31';
ALTER TABLE `order` ADD INDEX idx_status_create_time (`status`, `create_time`);

区分度高的字段适合创建索引。区分度是指一个字段取值不同的数量与总数量之比。比如对于一张用户表来说,生日比性别的区分度更高,更适合创建索引。

代码示例:

SELECT COUNT(DISTINCT birthday) / COUNT(*) AS birthday_cardinality, COUNT(DISTINCT gender) / COUNT(*) AS gender_cardinality FROM `user`;
ALTER TABLE `user` ADD INDEX idx_birthday (birthday);
  1. 有序的字段适合创建索引。有序的字段在插入数据库的过程中,仍能保持B+树的索引结构,不需要频繁更新索引文件,性能更好。例如,在订单表中,订单创建时间会有序递增,因此适合创建索引。

代码示例:

ALTER TABLE `order` ADD INDEX idx_create_time (create_time);
  • 三   哪些字段不适合创建索引?
  • 区分度低的字段不适合创建索引。如果一个字段的取值相对于总量来说比较小,那么创建索引的效果就会很差。例如,在用户表中,性别只有男女两种取值,不适合创建索引。
  • 频繁更新的字段不适合创建索引。更新字段的过程中,需要维护B+树结构,会频繁更新索引文件,降低SQL性能。例如,在文章表中,阅读量会频繁更新,不适合创建索引。
  • 过长的字段不适合创建索引。过长的字段会占用更多的空间,不适合创建索引。例如,在商品表中,商品详情可能很长,不适合创建索引。
  • 无序的字段不适合创建索引。无序的字段在插入数据库的过程中,为了维护B+树索引结构,需要频繁更新索引文件,性能较差。例如,在文章表中,内容字段是无序的,不适合创建索引。

四。创建索引的其他注意事项 

 

  • 优先使用联合索引。查询时,联合索引比普通索引能更精准地匹配所需数据。例如,在用户表中,如果需要查询某个城市和年龄段的用户,可以使用联合索引来优化查询性能。

代码示例:

ALTER TABLE `user` ADD INDEX idx_city_age (`city`, `age`);
  • 使用联合索引时,区分度高的字段放前面。这样可以减少查询次数,更快地匹配到所需数据。例如,在商品表中,按照分类和价格进行查询,可以将价格放在前面。

代码示例:

ALTER TABLE `product` ADD INDEX idx_category_price (`category`, `price`);
  • 过长字符串可以使用前缀索引。例如,在地址表中,如果乡镇已经能区分大部分用户了,就没必要精确到街道小区了。

代码示例:

ALTER TABLE `address` ADD INDEX idx_town (town(3));
  • 值唯一的字段,使用唯一索引。使用唯一索引,可以避免程序bug导致产生重复数据。例如,在用户表中,可以使用唯一索引来保证用户名的唯一性。

代码示例:

ALTER TABLE `user` ADD UNIQUE idx_username (username);
  1. 排序和分组字段也尽量创建索引。在order by和group by中的字段也尽量创建索引,避免使用文件排序,可以使用索引排序提供性能。例如,在订单表中,按照订单金额进行排序,可以创建索引来优化查询性能。

代码示例:

ALTER TABLE `order` ADD INDEX idx_amount (amount);
  1. 避免创建过多索引。索引好用,适度即可。创建过多的索引,会占用更多存储空间,也会严重影响SQL性能,每次更新SQL,都需要更新大量索引文件,得不偿失。例如,在用户表中,如果同时为性别、年龄、地区等多个字段创建索引,会导致索引文件过多,影响查询性能。

代码示例:

ALTER TABLE `user` ADD INDEX idx_gender (`gender`);
ALTER TABLE `user` ADD INDEX idx_age (`age`);
ALTER TABLE `user` ADD INDEX idx_city (`city`);

以上是创建合适数据库索引的一些经验和注意事项,但是也需要根据具体业务场景和数据情况灵活运用,找到最适合的优化方案。

以下是一些有趣的例子,希望能让你更有兴趣阅读。

例子一:快递员查询系统

假设有一个快递员查询系统,需要查询某个快递员最近三个月的送件情况。可以在快递员表中创建一个联合索引,包含快递员编号、送件时间两个字段。这样可以优化查询性能,快速查询某个快递员最近三个月的送件情况。

代码示例:

ALTER TABLE `courier` ADD INDEX idx_courier_deliver_time (`courier_id`, `deliver_time`);

例子二:电商平台商品查询

假设有一个电商平台,需要查询某个品牌的某个价格区间的商品信息。可以在商品表中创建一个联合索引,包含品牌、价格两个字段。这样可以优化查询性能,快速查询某个品牌的某个价格区间的商品信息。

代码示例:

ALTER TABLE `product` ADD INDEX idx_brand_price (`brand`, `price`);

例子三:音乐播放列表查询

假设有一个音乐播放列表,需要查询某个时间段内播放次数最多的歌曲。可以在播放记录表中创建一个联合索引,包含歌曲ID、播放时间两个字段。这样可以优化查询性能,快速查询某个时间段内播放次数最多的歌曲。

代码示例:

ALTER TABLE `play_record` ADD INDEX idx_song_time (`song_id`, `play_time`);

通过以上例子可以看出,创建合适的索引可以大大提高查询性能,优化数据库应用程序。同时,也需要注意不要过度使用索引,避免影响SQL性能。

通过本文的介绍,相信大家已经了解了MySQL索引的分类,以及创建和使用索引的一些经验和注意事项。在实际工作中,合理的使用索引可以大大提高查询性能,优化数据库应用程序。但是要注意不要过度使用索引,避免影响SQL性能。希望本文可以对大家有所帮助,让大家更好地使用MySQL数据库。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chuxia120715/article/details/129834409

mysql性能优化详解-爱代码爱编程

1.为什么要进行sql优化   因为没有进行sql优化的语句执行性能低下。而性能低下的原因:sql语句欠佳,索引失效,服务器参数设置不合理(缓冲、线程数)   本文整个优化过程 主要是围绕索引进行   2.Mysql安装启动配置(CentOS7)   1)版本介绍与选择   目前主流版本 5.x   5.0-5.1:

mysql表设计思路(一对多、多对多...)-爱代码爱编程

要开始单独负责需求了,捋一捋表设计的思路。 文章目录 一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结 一、MySQL中的数据类型 字符串类型

mysql innodb存储原理深入剖析与技术分析_mysql innodb 分析-爱代码爱编程

一、MySQL记录存储: MySQL InnoDB的数据由B+树来组织,数据记录存储在B+树数据页(page)中,每个数据页16kb,数据页 包括页头、虚记录、记录堆、自由空间链表、未分配空间、sl

mysql ocp888题解064-爱代码爱编程

文章目录 1、原题1.1、英文原题1.2、中文翻译1.3、答案 2、题目解析2.1、题干解析2.2、选项解析 3、知识点3.1、知识点1:通过FLUSH TABLE+拷贝文件+导入表空间的方式进行表

mysql——锁_meta data lock-爱代码爱编程

MySQL锁的概述 锁是计算机协调多个进程或线程并发访问某- -资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、1/0)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数

mysql数据库的增删改查(进阶),增加更加复杂的一些操作_mysql删除加复杂条件-爱代码爱编程

对于MySQL数据库,笔者在之前的一篇文章,详细的介绍了一些基础的语法:比如:最常见的MySQL语句的增删改查+数据库的创建+where语句/order by语句/limit分页等语法,那么感兴趣的各位老铁,可以观看一下:MySQL数据库中的增删查改(MySQL最核心,工作中最常用的部分),原文链接为:https://blog.csdn.net/we