假定你发出下列SELECT语句:
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。
你可以这样创建一个多列索引:
mysql>ALTER TABLE tbl_name ADD INDEX(col1,col2);
而你应该这样创建分开的单行列索引:
mysql>ALTER TABLE tble_name ADD INDEX(col1);
mysql>ALTER TABLE tble_name ADD INDEX(col1);
l 如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。例如,如果你有一个3行列索引(col1,col2,col3),你已经索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。
如果列不构成索引的最左面前缀,MySQL不能使用一个部分的索引。假定你下面显示的SELECT语句:
mysql> SELECT * FROM tbl_name WHERE col1=val1;
mysql> SELECT * FROM tbl_name WHERE col2=val2;
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。
l 如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。例如,下列SELECT语句使用索引:
mysql> select * from tbl_name where key_col LIKE "Patrick%";
mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";
在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。
下列SELECT语句将不使用索引:
mysql> select * from tbl_name where key_col LIKE "%Patrick%";
mysql> select * from tbl_name where key_col LIKE other_col;
在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。
l 如果 column_name 是一个索引,使用column_name IS NULL的搜索将使用索引。
l MySQL通常使用找出最少数量的行的索引。一个索引被用于你与下列操作符作比较的列:=、>、>=、<、<=、BETWEEN和一个有一个非通配符前缀象'something%'的LIKE的列。
l 对于一个多列索引,如果在WHERE子句的所有AND层次使用索引,将不使用来索引优化查询。为了能够使用索引优化查询,必须把一个多列索引的前缀使用在一个AND条件组中。
下列WHERE子句使用索引:
... WHERE index_part1=1 AND index_part2=2
... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */
... WHERE index_part1='hello' AND index_part_3=5
/* optimized like "index_part1='hello'" */
这些WHERE子句不使用索引:
... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */
... WHERE index=1 OR A=10 /* No index */
... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */
四:索引的作用
索引用于:
l 快速找出匹配一个WHERE子句的行。
l 在多个表的查询时,执行连接时加快了与其他表中的行匹配的行的搜索。
l 对特定的索引列找出MAX()或MIN()值。
l 如果排序或分组在一个可用索引的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。
l 在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。
五:索引的弊端
首先,索引文件要占磁盘空间。如果有大量的索引,索引文件可能会比数据文件更快地达到最大的文件尺寸。其次,索引文件加快了检索,但增加了插入和删除,以及更新索引列中的值的时间(即,降低了大多数涉及写入的操作的时间),因为写操作不仅涉及数据行,而且还常常涉及索引。一个表拥有的索引越多,则写操作的平均性能下降就越大。在8.4.4节记录装载和修改的速度中,我们将更为详细地介绍这些性能问题,并讨论怎样解决。
相关推荐
join连接缓存是针对多表连接查询的优化,它存储已经计算过的连接信息,减少重复计算。对于复杂的连接查询,合理调整缓存可以显著提升性能。 表缓存和表结构定义缓存,是MySQL为了加速打开表和获取表结构信息而设计...
### Nutch开源搜索引擎增量索引recrawl的终极解决办法续 #### 一、背景与问题概述 在前一篇文章中,我们探讨了Nutch开源搜索引擎在进行增量索引更新(recrawl)时遇到的问题及其初步解决方案。然而,在实际操作...
索引优化 索引可以显著提高查询效率,但也可能增加写操作的开销。合理设计索引策略,定期维护索引,如重建和重组,是优化数据库性能的关键。 ### 7. 其他注意事项 - 每个表可以有多个非聚集索引,但只能有一个...
这包括选择合适的索引策略、确定最佳的排序和分组方法、决定何时使用临时表等。物理优化通常基于成本模型,评估不同操作的成本,选择最低成本的执行计划。数据库管理系统会考虑各种因素,如I/O成本、CPU开销、内存...
3. 索引优化:合理设计索引结构,避免全表扫描,降低索引大小。 总结,Hibernate Search 3.3.0.Final与Hibernate 3.6的配合使用,为Java开发者提供了一个高效、易用的全文搜索解决方案。通过深入了解其配置、使用和...
- 多级静态索引通过多级查找表实现,动态索引使用查找树或哈希表,减少索引层次和排序需求。 这些知识点在实际的系统设计和数据管理中起着关键作用,理解和掌握它们有助于优化文件访问效率,提高系统性能。无论是...
2. 主键优化:主键通常有索引,因此在涉及主键字段的`MAX()`操作时,数据库能更快地找到最大值。 3. 深入理解SQL函数:每个函数都有其特定的执行逻辑,理解这些逻辑可以帮助我们更好地优化查询。 在实践中,我们...
哈希表是一种高效的数据结构,通过哈希函数将关键字映射到数组的索引位置。本文系统地介绍了哈希表的设计原则、冲突解决策略以及实现细节。 #### 十二、快速排序算法之所有版本的c/c++实现 快速排序是一种高效的...
10. **优化与性能**:为了提供最佳的用户体验,可能需要对下载策略进行优化,比如根据网络条件动态调整下载速度,或者在后台线程中执行下载,不影响游戏的正常运行。 以上是Unity实现断点续传功能的主要技术点。...
- 提供了TTL索引优化,便于数据过期清理。 - 具有全面的审计和加密功能,保证企业级数据安全。 - 实现了全链路过载保护,防止系统过载。 **副本与容灾** CMongo支持多种副本配置,如secondary、hidden、delayed和...
2. **数据库查询优化**:通过索引、预编译SQL、合理设计数据结构等方式,提高数据库查询效率。 3. **响应格式统一**:使用JSON作为数据交换格式,易于解析且跨平台兼容性好。注意避免转义问题,确保数据的正确传递...
这种方法可以优化等值连接,尤其是当表较大时。 索引连接(INDEX-JOIN)对第二个表的连接字段建立索引,然后通过第一个表的每个元组的连接字段值在索引中查找匹配项,找到后拼接成结果表的元组。这种方法适用于连接...
4. **Java并发工具类**:例如Atomic类(如AtomicInteger、AtomicLong)提供了原子操作,适用于线程安全的计数器和索引管理。BlockingQueue(阻塞队列)可用于线程间的通信,例如在下载任务的调度中,新任务可以被...
- **丰富的索引类型**:支持多种索引类型,提高查询效率。 - **高性能**:通过定制内核和优化,实现了高性能的读写性能。 - **企业级功能**:包括审计、存储加密和全链路限流,确保数据安全和合规性。 - **内核...
在实际编程中,还需要根据具体需求选择合适的方法,并注意性能优化,尤其是在处理大量字符串时。例如,避免频繁创建新字符串,可以使用`StringBuilder`或`StringBuffer`进行字符串拼接,减少内存开销。在处理国际化...
《Lucene5学习之Facet(续)》 在深入探讨Lucene5的Facet功能之前,我们先来了解一下什么是Faceting。Faceting是搜索引擎提供的一种功能,它允许用户通过分类或属性对搜索结果进行细分,帮助用户更精确地探索和理解...
例如,可以考虑使用更高效的分块策略,优化网络通信,或者使用更强大的数据库索引来加快MD5值的查询速度。 6. **错误处理与用户体验**:为了提供良好的用户体验,系统应该能够处理各种异常情况,如网络中断、服务器...
同时,这也为开发者提供了实践和优化网络编程技能的机会,比如学习如何更有效地处理网络请求,优化内存使用,以及提高用户体验。 总的来说,"Android 文件断点续传源码.zip"是一个很好的学习资源,它涵盖了Android...