`
kangkang203
  • 浏览: 13845 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mysql组合索引(最左前缀)

阅读更多

组合索引(最左前缀)

平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和 time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:

–title,time

–title

为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:

–使用到上面的索引

SELECT * FROM article WHREE title=你好 AND time=1234567890

SELECT * FROM article WHREE utitle=“你好”

–不使用上面的索引

SELECT * FROM article WHREE time=1234567890

 

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对 表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。 一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量 的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。

1. 何时使用聚集索引或非聚集索引?

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序 使用 使用
返回某范围内的数据 使用 不使用
一个或极少不同值 不使用 不使用
小数目的不同值 使用 不使用
大数目的不同值 不使用 使用
频繁更新的列 不使用 使用
外键列 使用 使用
主键列 使用 使用
频繁修改索引列 不使用 使用

事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索 引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序 的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体 内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

2. 索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

分享到:
评论

相关推荐

    MySQL组合索引与最左匹配原则详解

    之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...

    mysql索引(一篇就够).pdf

    3. 组合索引:由多个列组成的索引,只有查询条件涉及组合索引的最左侧列时,索引才会被有效利用(遵循最左前缀原则)。 4. Unique(唯一索引):索引列的值必须唯一,允许出现NULL值,但主键索引除外。 5. Key(普通...

    Mysql之组合索引方法详解

    组合索引的顺序非常重要,因为MySQL只能对索引中最左边列的前缀进行有效的查找,这种特性被称为“最左前缀原则”。这意味着如果有一个组合索引(c1, c2),那么查询语句`SELECT * FROM t1 WHERE c1=1 AND c2=2`和`...

    MySQL 8.0 之索引跳跃扫描(Index Skip Scan)

    该优化方式支持那些SQL在不符合组合索引最左前缀的原则的情况,优化器依然能组使用组合索引。 talk is cheap ,show me the code 实践 使用官方文档的例子,构造数据 mysql> CREATE TABLE t1 (f1 INT NOT NULL, f2 ...

    MySQL前缀索引导致的慢查询分析总结

    在这个例子中,尽管`username`字段有索引,但由于使用了前缀索引(`username(75)`),MySQL无法直接利用索引进行排序,因此选择了效率较低的`filesort`。 前缀索引是一种节省存储空间的策略,特别是当字段很长,但...

    mysql索引介绍学习

    * 按索引列数划分:单列索引、组合索引 * 按作用划分:覆盖索引、前缀索引等 MySQL的存储模型: * 连接管理:客户端跟数据库建立连接的过程,MySQL需要负责认证、管理连接、获取权限信息。 * 查询缓存:连接上之后...

    MySQL索引及其原理1

    - 最左前缀原则:组合索引时,最常用列放在最左边。 - 避免全表扫描,合理使用索引。 - 避免在索引列上使用不等操作符、函数或显式转换。 理解索引的工作原理和使用方法是提高MySQL数据库性能的关键。通过有效地...

    mysql索引优化.rar

    7. **最左前缀原则** - 在复合索引中,查询会从左到右匹配索引,如果中间有列未出现在查询条件中,右侧的列将不会被使用。 8. **索引失效情况** - 使用`OR`连接不同列时,如果没有单个索引包含所有列,可能会导致...

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    对于组合索引,查询时需要遵循最左前缀原则,即查询条件必须包含索引定义的最左侧字段。 ```sql SELECT * FROM ds_order WHERE create_time BETWEEN '2023-09-01' AND '2023-09-07' AND order_state = 2; ``` ####...

    MYSQL索引优化.docx

    例如,如果有一个组合索引(it1c1c2)基于(c1,c2),查询语句如`WHERE c1=1 AND c2=2`或`WHERE c1=1`可以利用这个索引,但`WHERE c2=2`则无法使用,因为它缺少引导列c1。 索引的类型根据存储引擎的不同而不同。B-Tree...

    MySQL索引的数据结构与算法.pptx

    1. **选择适当的索引类型**:根据应用的特点和需求选择合适的索引类型,如单列索引、组合索引、全文索引等。 2. **避免过度索引**:过多的索引会增加写入操作的成本,合理规划索引数量和类型。 3. **使用覆盖索引**...

    MySQL联合索引用法示例

    如果查询只包含联合索引中的一个列,那么数据库可能只能使用该列的部分索引,这被称为索引的最左前缀原则。例如,对于下面的查询: ```sql SELECT * FROM employee_dept WHERE employeeid = 1; ``` 即使有联合索引...

    mysql引擎及索引讲解

    为了使组合索引更加有效,查询时应遵循“最左前缀”原则,即查询条件应从索引的最左边开始。 #### 五、总结 在选择MySQL数据库引擎时,需要根据具体的应用场景和需求来决定。如果应用程序主要以读操作为主,且不...

    MySQL技术之索引.pptx

    - **组合索引 (Composite Index)**:多个字段共同构成一个索引,遵循"最左前缀"原则。 - **覆盖索引 (Covering Index)**:查询所需的所有信息都能在索引中找到,无需回表获取数据。 2. **索引创建原则**: - ...

    JAVA面试题MySQL索引原理及索引优化校招面试找工作笔试

    - **最左前缀原则**:在组合索引中,查询必须从最左侧的列开始匹配,否则无法使用索引。 索引优化是数据库管理的重要环节,可以通过分析查询语句的执行计划(使用EXPLAIN关键字)来确定是否有效利用了索引。此外,...

    导致MySQL索引失效的一些常见写法总结

    但使用`, `>`, `, `>=`, `<>`等不等运算符时,MySQL可能不会使用索引,除非是索引的最左前缀。 3. **范围查询**:如果查询条件包含索引列的范围,如`WHERE column BETWEEN a AND b`,MySQL通常只能使用索引的一部分...

    Mysql索引优化实战.zip

    因此,需要平衡读写性能和存储成本,为最常查询的字段和组合创建索引。 此外,避免在索引列上使用函数,因为这会导致数据库无法利用索引。如果必须使用函数,可以考虑创建覆盖索引,即包含所有查询所需列的索引,以...

Global site tag (gtag.js) - Google Analytics