mysql数据库索引优化
MySQL索引优化,explain详细讲解

MySQL索引优化,explain详细讲解前⾔:这篇⽂章主要讲 explain 如何使⽤,还有 explain 各种参数概念,之后会讲优化⼀、Explain ⽤法模拟Mysql优化器是如何执⾏SQL查询语句的,从⽽知道Mysql是如何处理你的SQL语句的。
分析你的查询语句或是表结构的性能瓶颈。
语法:Explain + SQL 语句;如:Explain select * from user; 会⽣成如下 SQL 分析结果,下⾯详细对每个字段进⾏详解⼆、id是⼀组数字,代表多个表之间的查询顺序,或者包含⼦句查询语句中的顺序,id 总共分为三种情况,依次详解id 相同,执⾏顺序由上⾄下id 不同,如果是⼦查询,id 号会递增,id 值越⼤优先级越⾼,越先被执⾏id 相同和不同的情况同时存在三、select_typeselect_type 包含以下⼏种值simpleprimarysubqueryderivedunionunion resultsimple简单的 select 查询,查询中不包含⼦查询或者 union 查询primary如果 SQL 语句中包含任何⼦查询,那么⼦查询的最外层会被标记为 primarysubquery在 select 或者 where ⾥包含了⼦查询,那么⼦查询就会被标记为 subQquery,同三.⼆同时出现derived在 from 中包含的⼦查询,会被标记为衍⽣查询,会把查询结果放到⼀个临时表中union / union result如果有两个 select 查询语句,他们之间⽤ union 连起来查询,那么第⼆个 select 会被标记为 union,union 的结果被标记为 union result。
它的 id 是为 null 的四、table表⽰这⼀⾏的数据是哪张表的数据五、typetype 是代表 MySQL 使⽤了哪种索引类型,不同的索引类型的查询效率也是不⼀样的,type ⼤致有以下种类systemconsteq_refrefrangeindexallsystem表中只有⼀⾏记录,system 是 const 的特例,⼏乎不会出现这种情况,可以忽略不计const将主键索引或者唯⼀索引放到 where 条件中查询,MySQL 可以将查询条件转变成⼀个常量,只匹配⼀⾏数据,索引⼀次就找到数据了eq_ref在多表查询中,如 T1 和 T2,T1 中的⼀⾏记录,在 T2 中也只能找到唯⼀的⼀⾏,说⽩了就是 T1 和 T2 关联查询的条件都是主键索引或者唯⼀索引,这样才能保证 T1 每⼀⾏记录只对应 T2 的⼀⾏记录举个不太恰当的例⼦,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.idref不是主键索引,也不是唯⼀索引,就是普通的索引,可能会返回多个符合条件的⾏。
mysqlhaving索引_MySql的groupbyhaving优化案例

mysqlhaving索引_MySql的groupbyhaving优化案例MySQLhaving索引MySQL数据库系统的GroupBy/Having子句用于查询表中的行,并根据一列或多列的值进行分组。
Having子句用于从分组中选择行。
这种语句经常用于统计报表,因此在一些场景中执行性能是非常重要的。
因此,优化GroupBy/Having子句是MySQL性能优化的一个重要部分。
本文旨在讨论MySQL使用GroupBy/Having子句时应执行的一般优化步骤,以及如何使用MySQLhaving索引来提高性能。
首先,在优化GroupBy/Having子句之前,应该确保表上有足够的索引以支持查询。
根据查询中所使用的参数,应该创建适当的复合索引,以支持GroupBy / Having子句。
在创建索引时,应该确保索引中的字段在查询中正确使用。
例如,如果查询使用where子句和group by子句,则必须提供包含where子句中所有字段的复合索引,以及group by子句中所有字段。
在这种情况下,其顺序(先where,后group by)也很重要,因此索引的字段顺序应该与查询中使用的字段顺序相同。
一旦表上有了合适的索引,则可以创建一个MySQLhaving索引,以支持GroupBy / Having子句的查询。
MySQLhaving索引可以是普通的B树索引,也可以是哈希索引或倒排索引。
MySQLhaving索引可以用来加速GroupBy / Having子句的查询,因为它可以减少查询中需要扫描的行数。
MySQLhaving索引的使用可以极大地提高查询的性能,从而减少查询执行时间。
一般来说,MySQLhaving索引应该包含GroupBy / Having子句中的所有字段。
使用MySQL进行全文索引和搜索优化

使用MySQL进行全文索引和搜索优化引言:在当今大数据时代,信息的快速检索和搜索成为一项非常重要的任务。
而全文索引是提高搜索效率的关键技术之一。
MySQL作为一种常用的关系型数据库,也提供了全文索引功能,可以帮助我们实现高效的全文搜索。
本文将介绍如何使用MySQL进行全文索引和搜索优化,以提升系统的性能和用户体验。
一、全文索引的基本概念和原理全文索引是一种将文本数据以特定的数据结构进行组织和管理,以支持关键字搜索的技术。
它可以快速地定位并返回包含搜索关键字的文档或记录。
全文索引常用于大型网站、论坛、博客等需要进行复杂搜索的应用场景。
全文索引的原理主要包括三个步骤:分词、建立倒排索引和搜索匹配。
1. 分词:将文本数据分割成一个个的词语,一般以空格、标点符号或其他分隔符号为界限。
分词可以使用自然语言处理工具,也可以使用MySQL内置的分词器。
2. 建立倒排索引:将分词之后的单词与其所在的文档或记录进行关联,形成倒排索引表。
倒排索引表记录了每个单词出现在哪个文档中,以及在该文档中的位置信息。
3. 搜索匹配:当进行全文搜索时,输入的关键字会与倒排索引进行匹配,找出与关键字相关的文档或记录。
二、MySQL全文索引的使用方法MySQL提供了全文索引的功能,并通过特定的语法和API使其易于使用。
下面以一个示例数据库为例,介绍MySQL全文索引的使用方法。
假设我们有一个名为"articles"的表,包含了文章的标题和内容字段。
首先,我们需要为"articles"表添加一个全文索引:```ALTER TABLE articles ADD FULLTEXT(title, content);```上述命令将在"title"和"content"字段上创建一个全文索引。
注意,只有使用MyISAM或InnoDB存储引擎的表才支持全文索引。
接下来,我们可以使用全文索引进行搜索。
MySQL数据库的哈希和索引优化技巧

MySQL数据库的哈希和索引优化技巧MySQL是广泛使用的关系型数据库管理系统,它的性能优化在大型应用中至关重要。
其中,哈希和索引技巧在提升数据库查询速度和提高性能方面起着非常重要的作用。
本文将重点讨论MySQL数据库的哈希和索引优化技巧,以帮助读者更好地了解和应用这些技术。
一、哈希优化技巧1.选择适当的哈希算法哈希算法是将数据映射到哈希表的关键步骤。
在选择哈希算法时,应根据具体的应用场景和数据特点来确定。
常见的哈希算法有MD5、SHA-1、CRC32等,每种算法都有自己的特点和适用范围。
根据实际情况选择适当的哈希算法可以提高哈希表的效率和性能。
2.合理设置哈希表的大小哈希表的大小直接影响哈希查找的效率。
如果哈希表的大小太小,会导致哈希冲突增多,查找效率降低;如果哈希表的大小太大,会导致内存消耗过高。
因此,应根据数据量和查询频率合理设置哈希表的大小,以达到最佳的查询效率和内存利用率。
3.使用一致性哈希算法一致性哈希算法可以解决分布式系统中的负载均衡问题。
它通过将哈希值映射到一个虚拟环上,将数据均匀地分布在各个节点上,实现了负载的均衡。
在MySQL数据库中,可以利用一致性哈希算法将数据分片存储在不同的数据库节点上,从而提高数据库的并发性和吞吐量。
二、索引优化技巧1.选择合适的索引类型MySQL提供了多种索引类型,包括B树索引、哈希索引、全文索引等。
不同类型的索引适用于不同的查询场景。
B树索引适用于范围查询和排序操作;哈希索引适用于等值查询;全文索引适用于文本搜索。
根据实际的查询需求选择合适的索引类型,可以大大提高查询效率。
2.使用复合索引复合索引是指在多个列上建立的索引。
它可以减少索引的个数,提高查询效率。
在使用复合索引时,应注意将最常用于查询条件的列放在索引的前面,以提高查询效率。
同时,也要避免建立过多的复合索引,因为索引的更新和维护会带来额外的开销。
3.避免过度索引过度索引会增加数据库的存储空间、降低写操作的性能,并可能导致索引失效。
MySQL中的唯一索引和非唯一索引选择与优化

MySQL中的唯一索引和非唯一索引选择与优化概述MySQL是一种常用的关系型数据库管理系统,许多网站和应用程序都使用它来存储和管理数据。
在MySQL中,索引是提高查询性能的重要因素之一。
本文将讨论MySQL中的唯一索引和非唯一索引的选择与优化。
索引简介索引是数据库中的一种数据结构,它能够加快查询的速度。
在MySQL中,索引分为唯一索引和非唯一索引两种类型。
唯一索引唯一索引是一种限制索引列中的值必须唯一的索引类型。
在唯一索引中,所有的索引值都必须是唯一的,这意味着一个表中不能有两行具有相同的索引值。
唯一索引的主要优点是确保数据的完整性和一致性。
它可以防止重复的数据出现在表中,并且可以通过快速查找来验证表中是否存在某个值。
此外,唯一索引还可以用于加速查询操作。
非唯一索引非唯一索引是一种不限制索引列中的值必须唯一的索引类型。
在非唯一索引中,多个行可以具有相同的索引值。
非唯一索引可以用于加快查询速度,但不保证数据的完整性和一致性。
非唯一索引的主要优点是提高查询性能。
当我们在非唯一索引列上进行查询时,数据库可以更快地定位到指定的数据。
这是因为非唯一索引可以通过使用索引值的二叉树或B树结构来进行快速查找。
唯一索引与非唯一索引的选择与优化在实际应用中,我们需要根据具体的需求来选择和优化唯一索引和非唯一索引。
唯一索引适用于需要确保数据完整性和一致性的场景,例如用户表中的用户名、邮箱、手机号等字段。
唯一索引可以防止重复数据的插入,并且可以通过快速查找来验证数据的唯一性。
但是,唯一索引的创建和维护会消耗额外的时间和空间,因此在大规模数据表中使用唯一索引时需要考虑性能和资源消耗的问题。
非唯一索引适用于快速搜索和排序的场景,例如商品表中的商品名称、价格等字段。
非唯一索引可以加速查询操作,使得数据库在大数据量的情况下能够更快地定位到指定的数据。
但是,过多的非唯一索引会增加磁盘和内存的消耗,并且对于更新操作(如插入、更新、删除)也会影响性能。
MySQL中的表分区和索引选择优化建议

MySQL中的表分区和索引选择优化建议在大数据时代的背景下,数据库的性能和优化变得越发重要。
MySQL作为最流行的开源数据库管理系统之一,在数据分析与存储方面扮演着重要的角色。
在MySQL中,表分区和索引选择是优化数据库性能的两个关键因素。
本文将探讨MySQL中的表分区和索引选择,并给出优化建议。
一、表分区的概述表分区是将一张表划分为多个较小的独立部分,每个部分可以存储在不同的物理位置上。
表分区的主要目的是提高查询和维护的性能。
通过将数据分布在多个分区上,可以减少查询的数据量,并且可以针对每个分区进行独立的维护操作。
在选择表分区的策略时,应该考虑数据的特点和查询模式。
以下是一些建议:1. 按范围分区:根据数据的范围进行分区,在每个分区上存储数据的范围是连续的。
这种分区策略适用于按照时间或者连续的数值范围进行查询的场景。
2. 按列表分区:按照某个字段的固定值进行分区,在每个分区上存储的数据具有相同的特征。
这种分区策略适用于按照某个字段值进行查询的场景。
3. 按哈希分区:根据某个字段的哈希值进行分区。
这种分区策略适用于需要将数据均匀分布在不同分区上的场景。
二、索引选择的优化索引是提高数据库查询效率的关键。
选择合适的索引可以大大加快查询的速度,并减少数据库的资源消耗。
以下是一些建议:1. 唯一索引:在表中选择合适的字段创建唯一索引。
唯一索引可以确保数据的唯一性,并且加快查询速度。
通常,在主键或者唯一标识的字段上创建唯一索引是一个明智的选择。
2. 组合索引:对于频繁同时查询多个字段的操作,可以考虑创建组合索引。
组合索引可以减少磁盘I/O次数和内存消耗。
3. 索引覆盖:尽量减少全表扫描,保证使用索引能够满足查询的需求。
使用索引覆盖可以减少数据库的资源消耗。
4. 索引统计信息:及时更新索引的统计信息。
MySQL提供了ANALYZE TABLE或者OPTIMIZE TABLE命令来更新索引的统计信息,确保数据库的查询优化器能够选择合适的索引进行查询。
MySQL中索引优化distinct语句及distinct的多字段操作

MySQL中索引优化distinct语句及distinct的多字段操作MySQL通常使⽤GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使⽤,通常会⽤到临时表.这样会影响性能. 在⼀些情况下,MySQL可以使⽤索引优化DISTINCT操作,但需要活学活⽤.本⽂涉及⼀个不能利⽤索引完成DISTINCT操作的实例.实例1 使⽤索引优化DISTINCT操作create table m11 (a int, b int, c int, d int, primary key(a)) engine=INNODB;insert into m11 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);explain select distinct(a) from m11;mysql> explain select distinct(a) from m11;复制代码代码如下:+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| 1 | SIMPLE | m11 | NULL | index | PRIMARY | PRIMARY | 4 | NULL | 1 | 100.00 | Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+说明:1 'a'列上存在主键索引,MySQL可以利⽤索引(key列值表明使⽤了主键索引)完成了DISTINCT操作.2 这是使⽤索引优化DISTINCT操作的典型实例.实例2 使⽤索引不能优化DISTINCT操作create table m31 (a int, b int, c int, d int, primary key(a)) engine=MEMORY;insert into m31 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);explain select distinct(a) from m31;mysql> explain select distinct(a) from m31;复制代码代码如下:+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m31 | NULL | ALL | NULL | NULL | NULL | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+说明:1 从查询执⾏计划看,索引没有被使⽤.2 对⽐实例1的建表语句,只是存储引擎不同.3 为什么主键索引没有起作⽤? 难道MEMORY存储引擎上的索引不可使⽤?实例3 使⽤索引可以优化DISTINCT操作的Memory表create table m33 (a int, b int, c int, d int, INDEX USING BTREE (a)) engine=MEMORY;insert into m33 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);explain select distinct(a) from m33;mysql> explain select distinct(a) from m33;+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m33 | NULL | index | NULL | a | 5 | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+说明:1 'a'列上存在主键索引,MySQL可以利⽤索引(key列值表明使⽤了主键索引)完成了DISTINCT操作.2 对⽐实例2,可以发现,⼆者都使⽤了Memory引擎. 但实例3指名使⽤Btree类型的索引.3 实例2没有指定使⽤什么类型的索引,MySQL将采⽤默认值. MySQL⼿册上说:As indicated by the engine name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast for single-value lookups, and very useful for creating temporary tables.结论:1 看索引对查询的影响,要注意索引的类型.2 HASH索引适合等值查找,但不适合需要有序的场景,⽽Btree却适合有序的场景.3 看查询执⾏计划,发现索引没有被使⽤,需要进⼀步考察索引的类型.DISTINCT不能选择多个字段的解决⽅法在实际应⽤中,我们经常要选择数据库某表中重复数据,通常我们是使⽤DISTINCT函数。
MySQL全文索引的使用方法与性能优化

MySQL全文索引的使用方法与性能优化引言:全文索引是一个重要的数据库功能,它可以大幅度提高数据库检索的效率。
在这篇文章中,我们将探讨MySQL全文索引的使用方法和性能优化,以帮助读者更好地理解和应用该功能。
一、全文索引简介全文索引是一种用于快速搜索文本数据的技术。
与普通的索引相比,全文索引不仅能够匹配关键词,而且能够根据关键词的相关性进行排序。
MySQL的全文索引功能可以轻松地实现快速和准确的文本检索,是一种非常有用的工具。
二、MySQL全文索引的创建和使用方法1. 创建全文索引要在MySQL中创建全文索引,需要在表的某个字段上使用FULLTEXT索引类型。
例如,我们有一个包含文章标题和内容的表article,我们可以使用以下命令在该表的content字段上创建全文索引:```ALTER TABLE article ADD FULLTEXT(content);```2. 使用全文索引进行检索一旦创建了全文索引,我们就可以使用MATCH AGAINST语句来进行文本检索。
MATCH AGAINST可以用于单个关键词的匹配,也可以用于多个关键词的组合匹配。
下面是几个示例:- 匹配单个关键词:```SELECT * FROM article WHERE MATCH(content) AGAINST('MySQL');```- 组合匹配多个关键词:```SELECT * FROM article WHERE MATCH(content) AGAINST('MySQL performance optimization');```- 指定关键词的权重进行匹配:```SELECT * FROM article WHERE MATCH(content) AGAINST('MySQL' WITH QUERY EXPANSION);```3. 全文索引的限制全文索引对于长文本的检索效果更好,对于短文本的效果可能有限。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们首先讨论索引,因为它是加快查询的最重要的工具。
还有其他加快查询的[url=javascript:;]技术[/url],但是最有效的莫过于恰当地使用索引了。
在MySQL 的邮件清单上,人们通常询问关于使查询更快的问题。
在大量的案例中,都是因为表上没有索引,一般只要加上索引就可以立即解决问题。
但这样也并非总是有效,因为优化并非总是那样简单。
然而,如果不使用索引,在许多情形下,用其他手段改善性能只会是浪费时间。
应该首先考虑使用索引取得最大的性能改善,然后再寻求其他可能有帮助的技术。
本节介绍索引是什么、它怎样改善查询性能、索引在什么情况下可能会降低性能,以及怎样为表选择索引。
下一节,我们将讨论MySQL 的查询优化程序。
除了知道怎样创建索引外,了解一些优化程序的知识也是有好处的,因为这样可以更好地利用所创建的索引。
某些编写查询的方法实际上会妨碍索引的效果,应该避免这种情况出现。
(虽然并非总会这样。
有时也会希望忽略优化程序的作用。
我们也将介绍这些情况。
)索引对单个表查询的影响索引被用来快速找出在一个列上用一特定值的行。
没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。
表越大,花费时间越多。
如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。
如果一个表有1000 行,这比顺序读取至少快100倍。
注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。
例如对下面这样的一个student表:mysql>SELECT * FROM student+------+---------+---------+---------+---------+| id | name | english | chinese | history |+------+---------+---------+---------+---------+| 12 | Tom | 66 | 93 | 67 || 56 | Paul | 78 | 52 | 75 || 10 | Marry | 54 | 89 | 74 || 4 | Tina | 99 | 83 | 48 || 39 | William | 43 | 96 | 52 || 74 | Stone | 42 | 40 | 61 || 86 | Smith | 49 | 85 | 78 || 37 | Black | 49 | 63 | 47 || 89 | White | 94 | 31 | 52 |+------+---------+---------+---------+---------+这样,我们试图对它进行一个特定查询时,就不得不做一个全表的扫描,速度很慢。
例如,我们查找出所有english成绩不及格的学生:mysql>SELECT name,english FROM student WHERE english<60;+---------+---------+| name | english |+---------+---------+| Marry | 54 || William | 43 || Stone | 42 || Smith | 49 || Black | 49 |+---------+---------+其中,WHERE从句不得不匹配每个记录,以检查是否符合条件。
对于这个较小的表也许感觉不到太多的影响。
但是对于一个较大的表,例如一个非常大的学校,我们可能需要存储成千上万的记录,这样一个检索的所花的时间是十分可观的。
如果,我们为english列创建一个索引:mysql>ALTER TABLE student ADD INDEX (english) ;+-------------------+| index for english |+-------------------+| 42 || 43 || 49 || 49 || 54 || 66 || 78 || 94 || 99 |+-------------------+如上表,此索引存储在索引文件中,包含表中每行的english列值,但此索引是在english 的基础上排序的。
现在,不需要逐行搜索全表查找匹配的条款,而是可以利用索引进行查找。
假如我们要查找分数小于60的所有行,那么可以扫描索引,结果得出5行。
然后到达分数为66的行,及Tom的记录,这是一个比我们正在查找的要大的值。
索引值是排序的,因此在读到包含Tom的记录时,我们知道不会再有匹配的记录,可以退出了。
如果查找一个值,它在索引表中某个中间点以前不会出现,那么也有找到其第一个匹配索引项的定位算法,而不用进行表的顺序扫描(如二分查找法)。
这样,可以快速定位到第一个匹配的值,以节省大量搜索时间。
数据库利用了各种各样的快速定位索引值的技术,这些技术是什么并不重要,重要的是它们[url=javascript:;]工作[/url]正常,索引技术是个好东西。
因此在执行下述查询mysql>SELECT name,english FROM user WHERE english<60;其结果为:+---------+---------+| name | english |+---------+---------+| Stone | 42 || William | 43 || Smith | 49 || Black | 49 || Marry | 54 |+---------+---------+你应该可以发现,这个结果与未索引english列之前的不同,它是排序的,原因正式如上所述。
索引对多个表查询的影响前面的讨论描述了单表查询中索引的好处,其中使用索引消除了全表扫描,极大地加快了搜索的速度。
在执行涉及多个表的连接查询时,索引甚至会更有价值。
在单个表的查询中,每列需要查看的值的数目就是表中行的数目。
而在多个表的查询中,可能的组合数目极大,因为这个数目为各表中行数之积。
假如有三个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别由含有数值1 到1000 的1000 行组成。
查找对应值相等的表行组合的查询如下所示:此查询的结果应该为1000 行,每个组合包含 3 个相等的值。
如果我们在无索引的情况下处理此查询,则不可能知道哪些行包含那些值。
因此,必须寻找出所有组合以便得出与WHERE 子句相配的那些组合。
可能的组合数目为1000×1000×1000(十亿),比匹配数目多一百万倍。
很多工作都浪费了,并且这个查询将会非常慢,即使在如像MySQL 这样快的数据库中执行也会很慢。
而这还是每个表中只有1000 行的情形。
如果每个表中有一百万行时,将会怎样?很显然,这样将会产生性能极为低下的结果。
如果对每个表进行索引,就能极大地加速查询进程,因为利用索引的查询处理如下:1) 如下从表t1 中选择第一行,查看此行所包含的值。
2) 使用表t2 上的索引,直接跳到t2 中与来自t1 的值匹配的行。
类似,利用表t3 上的索引,直接跳到t3 中与来自t1 的值匹配的行。
3) 进到表t1 的下一行并重复前面的过程直到t1 中所有的行已经查过。
在此情形下,我们仍然对表t1 执行了一个完全扫描,但能够在表t2 和t3 上进行索引查找直接取出这些表中的行。
从道理上说,这时的查询比未用索引时要快一百万倍。
如上所述,MySQL 利用索引加速了WHERE 子句中与条件相配的行的搜索,或者说在执行连接时加快了与其他表中的行匹配的行的搜索。
多列索引对查询的影响假定你发出下列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);如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。
例如,如果你有一个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)的最左面前缀。
如果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值以一个通配符字符开始。