首页 > 其他分享 >聊聊索引

聊聊索引

时间:2023-03-26 12:23:12浏览次数:33  
标签:brand 使用 查询 索引 聊聊 MySQL price

简介

MySQL是最流行的关系型数据库之一,索引是MySQL中最重要的性能优化技术之一。通过优化索引可以显著提升查询性能,降低查询的时间复杂度。本文将介绍MySQL索引的类型、不同类型的特点、最左匹配原则、回表、索引下推、在实际应用中如何建立索引以及索引优化的技巧。

一、MySQL的索引类型

MySQL中常用的索引类型有B-Tree索引、哈希索引、全文索引等。

  1. B-Tree索引:B-Tree是一种平衡树结构,可以快速定位数据,适用于等值查询和范围查询。MySQL中默认使用的就是B-Tree索引。
  2. 哈希索引:哈希索引将索引值通过哈希函数转化为固定长度的哈希值,适用于等值查询。但是哈希索引不支持范围查询和排序操作,因此很少使用。
  3. 全文索引:全文索引是一种特殊的索引,适用于对文本进行关键字搜索。

二、不同类型索引的特点

  1. B-Tree索引:适用于等值查询和范围查询,可以利用索引的有序性进行排序操作。
  2. 哈希索引:适用于等值查询,不支持范围查询和排序操作。
  3. 全文索引:适用于文本搜索,支持模糊查询和关键字查询。

三、最左匹配原则

最左匹配原则指的是在联合索引中,如果查询语句中只使用了索引的前缀部分,那么MySQL仍然可以使用该索引。
例如,如果有一个联合索引 (a, b, c),那么当查询语句中使用了 a 和 b 时,MySQL仍然可以使用该索引进行查询。但如果只使用了 b 和 c,则该索引将无法使用。

四、回表

回表指的是当MySQL查询某条记录时,如果查询的结果集中包含非索引列,那么MySQL需要根据索引的值再次回到表中进行查找。回表操作会增加磁盘IO次数,因此尽可能避免回表可以提升查询性能。

五、索引下推

索引下推是MySQL 5.6引入的一项优化技术,它可以将一些过滤操作下推到存储引擎层面,减少回表次数。具体来说,索引下推可以将WHERE子句中的一些条件下推到索引扫描阶段,从而减少回表次数。

六、在实际应用中如何建立索引

一个非常重要的问题。过多或过少的索引都会影响查询性能。以下是一些关于如何建立索引的经验:

  1. 为经常使用的列建立索引:在表中,如果经常被用于查询或排序的列,应该优先考虑建立索引。
  2. 对于大表,应该尽量使用复合索引:因为复合索引可以减少磁盘IO次数,提高查询性能。
  3. 不要建立过多的索引:建立太多的索引会影响更新操作的性能,并且会浪费磁盘空间。
  4. 使用索引覆盖:索引覆盖是指查询语句只需要扫描索引,而不需要回表操作。使用索引覆盖可以减少磁盘IO次数,提高查询性能。
  5. 避免使用全表扫描:如果没有合适的索引,MySQL将会执行全表扫描,这会导致性能问题。

七、索引优化的技巧

  1. 去除重复索引:重复索引会增加更新操作的开销,因此应该去除重复索引。
  2. 定期重新组织索引:在表中频繁进行更新和删除操作后,索引可能变得不均匀,因此应该定期重新组织索引。
  3. 使用覆盖索引:使用覆盖索引可以避免回表操作,提高查询性能。
  4. 避免使用模糊查询:模糊查询通常会导致全表扫描,因此应该避免使用模糊查询。
  5. 避免在索引列上使用函数:如果在索引列上使用函数,MySQL将不会使用该索引,而是执行全表扫描。
    总之,索引是MySQL中非常重要的性能优化技术之一,通过优化索引可以显著提升查询性能,降低查询的时间复杂度。在实际应用中,应该根据业务需求和查询场景合理地建立索引,并定期进行索引优化。

八、结合具体的业务场景讲讲索引优化

,结合电商场景再举几个索引优化技巧的例子:

  1. 使用联合索引:在电商系统中,用户可以根据商品名称、价格、品牌等信息进行搜索,因此可以为这些属性建立联合索引,以提高搜索性能。
  2. 建立唯一索引:在电商系统中,用户可能会添加、修改、删除商品,因此可以为商品的唯一标识(如商品ID)建立唯一索引,以保证数据的一致性和唯一性。
  3. 避免在索引列上使用不等于(!=)操作符:在电商系统中,如果需要查询价格不等于某个值的商品,应该使用范围查询(如大于或小于)代替不等于操作符,以避免全表扫描。
  4. 避免在索引列上使用ORDER BY或GROUP BY:在电商系统中,如果需要对查询结果进行排序或分组,应该尽量避免在索引列上使用ORDER BY或GROUP BY,而是使用覆盖索引或者使用非索引列进行排序或分组。
  5. 定期检查和优化索引:在电商系统中,商品信息可能会频繁添加、修改或删除,因此应该定期检查和优化索引,以保证查询性能和数据的一致性。
    综上所述,对于电商场景等业务系统,合理建立和优化索引可以大大提高查询性能,加速系统的响应速度,提高用户体验。
    假设有一个商品表goods,其中包含了id、name、price、brand等属性。现在需要查询价格大于100元且品牌为“Apple”的商品,可以使用以下SQL语句:
SELECT id, name, price, brand FROM goods WHERE price > 100 AND brand = 'Apple';

针对这个查询语句,我们可以考虑以下的索引优化技巧:

  1. 使用联合索引:可以为price和brand两个属性建立联合索引,以提高查询性能,SQL语句如下:
CREATE INDEX idx_price_brand ON goods (price, brand);
  1. 覆盖索引:在查询语句中,只需要返回id、name、price和brand四个属性,可以将这四个属性建立成覆盖索引,以避免回表操作,SQL语句如下:
CREATE INDEX idx_price_brand_covering ON goods (price, brand, id, name);
  1. 避免在索引列上使用不等于(!=)操作符:如果需要查询价格不等于某个值的商品,应该使用范围查询(如大于或小于)代替不等于操作符,SQL语句如下:
SELECT id, name, price, brand FROM goods WHERE price > 100 AND brand <> 'Apple';
  1. 避免在索引列上使用ORDER BY或GROUP BY:如果需要对查询结果进行排序或分组,应该尽量避免在索引列上使用ORDER BY或GROUP BY,而是使用覆盖索引或者使用非索引列进行排序或分组,SQL语句如下:
SELECT id, name, price, brand FROM goods WHERE price > 100 AND brand = 'Apple' ORDER BY id;
  1. 定期检查和优化索引:可以通过EXPLAIN语句查看查询计划,分析索引使用情况,以及使用SHOW INDEXES语句查看索引状态,定期进行索引优化,SQL语句如下:
EXPLAIN SELECT id, name, price, brand FROM goods WHERE price > 100 AND brand = 'Apple';
SHOW INDEXES FROM goods;

综上所述,通过合理建立和优化索引,可以提高查询性能和系统响应速度,提高用户体验。同时,需要根据具体业务场景和查询需求,选择合适的索引类型和建立策略。

标签:brand,使用,查询,索引,聊聊,MySQL,price
From: https://www.cnblogs.com/mengxiaoleng/p/17258430.html

相关文章

  • 索引构建
    背景面向C端用户的在线核心搜索系统底层采用ES作为核心“存储/检索”引擎,搜索作为用户购买决策的核心链路的一部分,对系统的可靠性要求tp9999,对查询性能要求极高(召回+排序......
  • 8年采购转销售,有相同经历的来聊聊吗
    8年采购转销售,之前是电子行业采购,现在是元器件行业销售小白。一切从头开始,专业知识积累,人脉积累,客户积累。。。心态还好,没有所谓的甲乙方身份互换带来的心理不适,积累中,有木......
  • Oracle 创建索引
    创建索引一般分为在线索引和非在线索引,在线与非在线的区别:非在线锁表,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML......
  • 微服务 初始 分布式搜索引擎 Elastic Search
    文章目录⛄引言一、什么是ElasticSearch?二、ElasticSearch倒排索引⛅正向索引⚡倒排索引⛄正向和倒排三、ES的一些概念⛅文档和字段⚡索引和映射四、MySQL与Elasticsea......
  • oracle数据库表索引空间不够
    oracle数据库表索引空间不够步骤1:检查索引空间使用情况首先,需要检查数据库的索引空间使用情况,以确定是否存在空间不足的问题。可以使用以下SQL语句查询当前索引空间的使......
  • 聊聊Python中的GIL https://www.cnblogs.com/ArsenalfanInECNU/p/9968621.html
    抄自:https://www.cnblogs.com/ArsenalfanInECNU/p/9968621.htmlGIL的全称是GlobalInterpreterLock,全局解释器锁。因为Python的执行依赖于解释器。Python最初的设计理......
  • 最强分布式搜索引擎——ElasticSearch
    最强分布式搜索引擎——ElasticSearch本篇我们将会介绍到一种特殊的类似数据库存储机制的搜索引擎工具——ESelasticsearch是一款非常强大的开源搜索引擎,具备非常多强大......
  • 甩出11张图-让我们来构想(实现)一个倒排索引
    甩出11张图-让我们来构想(实现)一个倒排索引倒排索引的简介在介绍倒排索引之前,先看看传统b+tree索引是如何存储数据的,每次新增数据的时候,b+tree就会往自身节点上添加上新......
  • 编程技巧-索引标记法
    在本周的CodeReview中,从Pair学到一个技巧--索引标记法(暂且叫这个名称)题目以任意一个Cell中心,根据8个邻居状态,判断该Cell下一个状态:如果2个活着那么保持状态不变,3个邻居活......
  • 模糊查询下(like)如何使用覆盖索引优化
    在MySQL中,like‘string%’可以用到索引,但是like‘%string%’却会全表扫描。这个是常识,但真的就没有解决方法了吗?有的,要使用到索引覆盖。什么叫覆盖索引?解释一:就是select......