组合索引(最左前缀)
平时用的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联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...
3. 组合索引:由多个列组成的索引,只有查询条件涉及组合索引的最左侧列时,索引才会被有效利用(遵循最左前缀原则)。 4. Unique(唯一索引):索引列的值必须唯一,允许出现NULL值,但主键索引除外。 5. Key(普通...
组合索引的顺序非常重要,因为MySQL只能对索引中最左边列的前缀进行有效的查找,这种特性被称为“最左前缀原则”。这意味着如果有一个组合索引(c1, c2),那么查询语句`SELECT * FROM t1 WHERE c1=1 AND c2=2`和`...
该优化方式支持那些SQL在不符合组合索引最左前缀的原则的情况,优化器依然能组使用组合索引。 talk is cheap ,show me the code 实践 使用官方文档的例子,构造数据 mysql> CREATE TABLE t1 (f1 INT NOT NULL, f2 ...
在这个例子中,尽管`username`字段有索引,但由于使用了前缀索引(`username(75)`),MySQL无法直接利用索引进行排序,因此选择了效率较低的`filesort`。 前缀索引是一种节省存储空间的策略,特别是当字段很长,但...
* 按索引列数划分:单列索引、组合索引 * 按作用划分:覆盖索引、前缀索引等 MySQL的存储模型: * 连接管理:客户端跟数据库建立连接的过程,MySQL需要负责认证、管理连接、获取权限信息。 * 查询缓存:连接上之后...
- 最左前缀原则:组合索引时,最常用列放在最左边。 - 避免全表扫描,合理使用索引。 - 避免在索引列上使用不等操作符、函数或显式转换。 理解索引的工作原理和使用方法是提高MySQL数据库性能的关键。通过有效地...
7. **最左前缀原则** - 在复合索引中,查询会从左到右匹配索引,如果中间有列未出现在查询条件中,右侧的列将不会被使用。 8. **索引失效情况** - 使用`OR`连接不同列时,如果没有单个索引包含所有列,可能会导致...
对于组合索引,查询时需要遵循最左前缀原则,即查询条件必须包含索引定义的最左侧字段。 ```sql SELECT * FROM ds_order WHERE create_time BETWEEN '2023-09-01' AND '2023-09-07' AND order_state = 2; ``` ####...
例如,如果有一个组合索引(it1c1c2)基于(c1,c2),查询语句如`WHERE c1=1 AND c2=2`或`WHERE c1=1`可以利用这个索引,但`WHERE c2=2`则无法使用,因为它缺少引导列c1。 索引的类型根据存储引擎的不同而不同。B-Tree...
1. **选择适当的索引类型**:根据应用的特点和需求选择合适的索引类型,如单列索引、组合索引、全文索引等。 2. **避免过度索引**:过多的索引会增加写入操作的成本,合理规划索引数量和类型。 3. **使用覆盖索引**...
如果查询只包含联合索引中的一个列,那么数据库可能只能使用该列的部分索引,这被称为索引的最左前缀原则。例如,对于下面的查询: ```sql SELECT * FROM employee_dept WHERE employeeid = 1; ``` 即使有联合索引...
为了使组合索引更加有效,查询时应遵循“最左前缀”原则,即查询条件应从索引的最左边开始。 #### 五、总结 在选择MySQL数据库引擎时,需要根据具体的应用场景和需求来决定。如果应用程序主要以读操作为主,且不...
- **组合索引 (Composite Index)**:多个字段共同构成一个索引,遵循"最左前缀"原则。 - **覆盖索引 (Covering Index)**:查询所需的所有信息都能在索引中找到,无需回表获取数据。 2. **索引创建原则**: - ...
- **最左前缀原则**:在组合索引中,查询必须从最左侧的列开始匹配,否则无法使用索引。 索引优化是数据库管理的重要环节,可以通过分析查询语句的执行计划(使用EXPLAIN关键字)来确定是否有效利用了索引。此外,...
但使用`, `>`, `, `>=`, `<>`等不等运算符时,MySQL可能不会使用索引,除非是索引的最左前缀。 3. **范围查询**:如果查询条件包含索引列的范围,如`WHERE column BETWEEN a AND b`,MySQL通常只能使用索引的一部分...
因此,需要平衡读写性能和存储成本,为最常查询的字段和组合创建索引。 此外,避免在索引列上使用函数,因为这会导致数据库无法利用索引。如果必须使用函数,可以考虑创建覆盖索引,即包含所有查询所需列的索引,以...