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

MySQL数据库优化(七):MySQL如何使用索引

阅读更多

原文地址:http://database.ctocio.com.cn/tips/315/8161815.shtml

 

 

索引用于快速找到特定一些值的记录。如果没有索引,MySQL就必须从第一行记录开始读取整个表来检索记录。表越大,资源消耗越大。如果在字段上有索引的话,MySQL就能很快决定该从数据文件的哪个位置开始搜索记录,而无须查找所有的数据。如果表中有1000条记录的话,那么这至少比顺序地读取数据快100倍。注意,如果需要存取几乎全部1000条记录的话,那么顺序读取就更快了,因为这样会使磁盘搜索最少。

  大部分MySQL索引(PRIMARY KEY, UNIQUE,INDEX 和 FULLTEXT)都是以B树方式存储。只有空间类型的字段使用R树存储,MEMORY (HEAP)表支持哈希索引。

  字符串默认都是自动压缩前缀和后缀中的空格。

  通常,如下所述几种情况下可以使用索引。哈希索引(用于 MEMORY 表)的独特之处在后面会讨论到。

  想要尽快找到匹配 WHERE 子句的记录。

  根据条件排除记录。如果有多个索引可共选择的话,MySQL通常选择能找到最少记录的那个索引。

  做表连接查询时从其他表中检索记录。

  想要在指定的索引字段 key_col 上找到它的 MIN() 或 MAX() 值。优化程序会在检查索引的

  key_col 字段前就先检查其他索引部分是否使用了 WHERE key_part_# = constant 子句。这样的话,

  MySQL会为 MIN() 或 MAX() 表达式分别单独做一次索引查找,并且将它替换成常数。当所有的表达式都被替换成常数后,查询就立刻返回。如下:

  SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;

  对表作排序或分组,当在一个可用的最左前缀索引上做分组或排序时(如 ORDER

  BY key_part1, key_part2)。如果所有的索引部分都按照 DESC 排序,索引就按倒序排序。

  有些时候,查询可以优化使得无需计算数据就能直接取得结果。当查询使用表中的一个数字型字段,且这个字段是索引的最左部分,则可能从索引树中能很快就取得结果:


  SELECT key_part3 FROM tbl_name WHERE key_part1=1

  假设有如下 SELECT 语句:


  mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

  如果在 col1 和 col2 上有一个多字段索引的话,就能直接取得对应的记录了。如果在 col1 和 col2 分别有独立的索引,那么优化程序会先找到限制最多的那个索引,然后根据哪个索引能找到更少的记录就决定使用哪个索引。

 

 

 

如果表里有一个多字段索引的话,那么该索引的任何最左前缀部分都可以被优化程序用来检索记录。例如,在 (col1, col2, col3) 上有一个索引,那么按字段组合 (col1), (col1, col2), 和 (col1, col2,col3) 搜索的时候都会用到索引。

  MySQL无法使用非最左前缀索引中的部分索引。假如有以下 SELECT 语句:


  SELECT * FROM tbl_name WHERE col1=val1;
  SELECT * FROM tbl_name WHERE col2=val2;
  SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

  如果在 (col1, col2, col3) 上有一个索引,只有第一个查询用到索引了。第二和第三个尽管包括了索引字段,但是 (col2) 和 (col2, col3) 并非索引 (col1, col2, col3) 的最左前缀部分。

  当对字段做 =, >, >=, <, <=, 或 BETWEEN 比较操作时,也会用到索引。

  MySQL在做 LIKE 比较时也可能用到索引,如果 LIKE 的参数是非通配字符开始的固定字符串的话。以下的 SELECT 语句就用到了索引:


  SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
  SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

  第一个查询中,只有的 'Patrick' <= key_col < 'Patricl' 记录才会被检索到。第二个查询中,只检索 'Pat' <= key_col < 'Pau' 的记录。

  以下 SELECT 语句不使用索引:


  SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
  SELECT * FROM tbl_name WHERE key_col LIKE other_col;

  第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。

  MySQL 4.0及更高会做一个额外的 LIKE 优化。如果使用 ... LIKE '%string%' 并且 string 超过3个字符,MySQL就会用 Turbo Boyer-Moore 算法来初始化模式,并且利用这个模式来加快搜索。

  用 col_name IS NULL 搜索时也会使用索引,如果字段 col_name 上有索引的话。

  任何在 WHERE 子句中没有跨越全部 AND 级分句的索引都不会用来优化查询。换言之,想要启用一个索引,那么在任何 AND 分句中都必须使用索引的前缀字段。

  以下 WHERE 子句使用索引:

 

 


  ... WHERE index_part1=1 AND index_part2=2 AND other_column=3
  /* index = 1 OR index = 2 */
  ... WHERE index=1 OR A=10 AND index=2
  /* 优化了 like "index_part1='hello'" */
  ... WHERE index_part1='hello' AND index_part3=5
  /* 使用索引 index1,但没有用到 index2 或 index3 */
  ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

  以下 WHERE 子句不使用索引:


  /* 没用到 index_part1 */
  ... WHERE index_part2=1 AND index_part3=2
  /* 所有的 AND 部分没用到索引 */
  ... WHERE index=1 OR A=10
  /* 索引没有跨越全部字段 */
  ... WHERE index_part1=1 OR index_part2=10

  有些时候尽管有可用的索引,MySQL也不会用到它们。一种情况是优化程序认为如果使用索引会需要检索更大部分的表记录(这时候,扫描表可能更快,因为这支需要更少的搜索)。尽管如此,如果有一个查询用 LIMIT 限制只检索部分记录,MySQL就一定会使用索引,因为这样能更快检索到更少记录来返回给结果。

  以下是哈希索引的一些不同的特性:

  它们只用于 = 或 <=> 比较(但并不很快)。

  优化程序无法使用哈希索引来加速 ORDER BY 操作(这种索引不能用于按顺序搜索下一个记录)。

  MySQL大致无法判断出介于两个值之间有多少记录(这由范围优化程序来决定使用哪个索引)。这在把 MyISAM 表类型改为采用哈希索引的 MEMORY 类型后可能会影响一些查询。

  只有全部索引键才能用于检索记录(如果是B树索引,任何前缀部分索引也能用于检索记录)。

分享到:
评论

相关推荐

    MySQL数据库优化SQL篇PPT课件.pptx

    MySQL数据库优化SQL篇PPT课件.pptx 本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和...

    书籍:Oracle与MySQL数据库索引设计与优化

    《Oracle与MySQL数据库索引设计与优化》这本书深入探讨了两个主流关系型数据库管理系统——Oracle和MySQL中的索引设计和优化策略。索引是数据库性能的关键因素,它们能够加速数据检索,提高系统效率,尤其在大数据量...

    MySQL数据库:使用NAVICAT工具创建和管理索引.pptx

    了解和掌握如何通过NAVICAT创建和管理索引是MySQL数据库管理员的基本技能。正确地使用索引可以极大地提高数据检索速度,减少数据库服务器的负载,但同时也要注意,过多的索引可能会占用额外的存储空间,并可能在插入...

    深入浅出MySQL数据库开发、优化与管理维护.doc

    在本篇中,我们将学习 MySQL 数据库优化的知识点,包括查询优化、索引优化、存储优化和服务器优化等。 管理维护篇 在本篇中,我们将学习 MySQL 数据库管理维护的知识点,包括数据库备份、数据库恢复、服务器监控和...

    国家开放大学 形考答案 mysql 实验训练4:视图和索引的构建与使用

    本资源为 MySQL 实验训练第四课,主要涵盖视图和索引的构建与使用。实验目的是基于已有的汽车用品网上商城数据库 Shopping,理解视图和索引的概念和作用,练习视图的基本操作,包括视图的建立、视图的查询、视图的...

    国家开放大学 MySQL数据库应用 实验训练4:数据库系统维护

    MySQL 数据库应用实验训练 4:数据库系统维护 本实验训练旨在帮助学生理解视图和索引的概念和作用,掌握视图和索引的基本操作,并且了解它们在数据库系统维护中的应用。 一、视图的概念和作用 视图是一种基于基表...

    基于MySQL数据库的查询性能优化研究.pdf

    2. 适当使用索引:合理的索引设计可以大大提高查询速度,例如使用组合索引、避免使用 SELECT \* 等。 3. 优化查询语句:优化查询语句,例如使用 EXISTS 语句代替 IN 语句、避免使用HAVING 子句等。 4. 使用缓存...

    sql查询优化(提高MySQL数据库查询效率的几个技巧)

    * 使用索引:在频繁查询的列上建立索引,可以提高查询效率。 * 优化 SQL 语句:使用 EXPLAIN 语句来分析 SQL 语句的执行计划,优化查询语句。 * 使用存储过程:使用存储过程可以将频繁查询的操作封装起来,提高查询...

    尚硅谷mysql高级:索引、优化

    一、MySQL索引 1. 索引类型:MySQL支持多种索引类型,包括B-Tree(默认索引类型)、Hash、Full-text(全文索引)以及R-tree(空间数据索引)。B-Tree索引适用于范围查询,而Hash索引适用于等值查询,Full-text索引...

    MySQL索引优化课件

    本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,我们要理解什么是索引。索引就像书的目录,它为数据库中的数据提供快速访问的途径。在MySQL中,常见的索引类型有B-Tree...

    MySQL数据库索引优化

    MySQL数据库索引优化是数据库管理员和开发人员在提升数据库性能方面的一个关键点,涉及BTree索引和Hash索引以及索引优化的策略。索引是数据库中一种非常重要的数据结构,它能够大幅提升查询的效率,但也需要恰当的...

    MySQL数据库项目资源:从入门到实战的全方位指南

    内容概要:本文档旨在为初学者及具有一定基础的软件工程设计师提供详尽的MySQL数据库项目学习路径。内容涵盖MySQL基础入门、进阶技能和实战案例三个部分。基础知识包括MySQL的安装配置、基本操作和SQL语法;进阶技能...

    Mysql数据库与SQL优化+集群+负载均衡.doc

    MySQL 数据库与 SQL 优化 + 集群 + 负载均衡 MySQL 数据库与 SQL 优化是提高数据库性能的关键一步骤。 SQL 优化可以通过优化数据库结构、索引、查询语句等方式来实现。下面是 MySQL 数据库与 SQL 优化的主要知识点...

    Mysql数据库性能优化

    MySQL数据库性能优化是一个涵盖多个方面的主题,涉及到数据库配置、索引优化、查询优化、存储引擎选择、内存管理以及数据模型设计等多个环节。以下是对这些关键领域的详细解释: 1. **数据库配置**: - `my.cnf` ...

    MySQL数据库性能优化研究.docx

    MySQL 数据库性能优化研究 MySQL 数据库性能优化是当前数据库管理系统中最重要的研究领域之一。随着互联网技术的快速发展,MySQL 数据库被广泛应用于各种业务场景。然而,当数据库规模不断扩大,查询复杂度增加时,...

    mysql数据库索引类型

    MySQL数据库索引是指在关系型数据库管理系统中,用于提高查询速度和优化数据库性能的一种机制。索引是对数据库表中某一列或多列的值进行排序和组织,以便快速定位和检索数据。 一、MySQL数据库索引类型 MySQL...

    mysql数据库基础全部课件

    2. 创建与管理索引:学习如何创建、查看和删除索引,以及索引的优化策略。 3. 查询优化:探讨如何通过调整索引和SQL语句来提升查询性能。 六、事务处理 1. 事务的概念:理解ACID(原子性、一致性、隔离性、持久性)...

Global site tag (gtag.js) - Google Analytics