`

mysql 索引知识积累

    博客分类:
  • java
 
阅读更多

1.MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的 peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有 记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。

2.当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。

3.
多列索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引 为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引: 

firstname,lastname,age
firstname,lastname
firstname



从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引: 

SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND 
age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND 
lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The 
following queries cannot use the index at all: SELECT peopleid FROM people WHERE 
lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid 
FROM people WHERE lastname='Sullivan' AND age='17';


4.在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。

5.
我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。 我们还必须考虑到对列进行比较的操作符类型。MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN, IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引。 

6.
对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。

 

7. 索引的存储分类
    MyISAM存储引擎的表的数据和索引时自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和索引时存储在同一表空间里面,但可以有多个文件组成。
   MySQL中索引的存储类型目前只有两种(BTREE和HASH),具体和表的存储引擎相关;MyISAM和InnoDB存储引擎都只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
   MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以以只取name的前4个字符进行索引,这个特征可以大大缩小索引文件的大小。在设计表结构的时候也可以对文本列根据此特性进行灵活设计。例如

引用

  create index ind_company2_name on company2(name(4))

8.下面一些情况存在索引但不使用索引,你可能认为它会用,但是实际上它就是没用。
 

引用

   1. 如果Mysql估计使用索引比全表扫描更慢,则不使用索引。
    例如列key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好
    select * from table_name where key_part1 > 1 and key_part1 < 90;

   2.  如果使用MEMORY/HEAP表并且where条件中不使用"="进行索引列,那么不会用到索引。heap表只有在" ="的条件下才会使用索引
    
   3. 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没用索引,那么涉及的索引都不会被用到

  4. 如果不是索引列的第一部分,那么也不会使用。

  5. 如果like是以"%"开始

  6. 如果列类型是字符串,那么一定记得在where条件中把字符常量值用引号引起来,否则即便这个列上有索引,Mysql也不会使用。因为MYSQL默认把输入的常量值进行转换以后才进行检索。

最后查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引经常不被使用到。Handler_read_rnd_next的值高则说明查询运行低效,并且应该建立索引补救。这个值的含义是在数据文件中读取下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next的值较高,则通常说明表索引不正确或者写入的查询没有利用索引。
还记得怎么看Handler_read_rnd_next 吗?
使用show statuts like 'Handler_read_%';
分享到:
评论

相关推荐

    结束语.点线网面一起构建MySQL知识网络1

    当我们深入探索MySQL中的事务、索引、存储引擎等概念时,应当将这些知识点串联起来,形成知识网络。例如,通过理解临时表的作用以及它与日志记录的关系,我们可以更加全面地掌握事务机制、日志格式以及数据同步的...

    mysql知识点整理收藏

    ### MySQL知识点整理:SQL语句优化 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,其性能优化一直是数据库管理中的重要议题。本文档主要关注于SQL语句层面的优化策略,旨在通过改善SQL语句的...

    丁奇Mysql45.zip

    这个压缩文件的核心内容很可能是丁奇在深入研究MySQL过程中积累的笔记、教程或案例,旨在帮助学习者掌握MySQL的关键技术和实践应用。 MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典的MySQL AB...

    用来学习MySQL相关知识,不希望自己可以成为牛逼大佬,但是希望自己一天比一天强大.zip

    MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于学习的特点,在Web开发领域占据了重要的地位。...不断积累经验,解决实际问题,你的MySQL技能将会一天比一天强大。

    本教程旨在为读者提供MySQL的基础知识和操作指南,帮助大家快速入门并掌握MySQL的核心概念

    通过本教程的学习,我们不仅掌握了MySQL的基础知识和基本操作,还了解了如何进行索引创建和性能优化等高级技能。未来,随着业务需求的不断变化和技术的发展进步,MySQL将继续发挥重要作用,成为数据管理和处理的强大...

    强昌金-揭秘MySQL OCP,全面掌握MySQL技术的最佳途径

    分析问题的思路不仅包括了对操作系统和MySQL自身的监控和分析,还涉及到了SQL优化,例如如何分析慢查询日志,以及通过SHOW STATUS获取表锁定等待时间、发送数据、复制到临时表和创建排序索引等状态信息来诊断问题。...

    mysql性能优化.pdf

    ### MySQL性能优化关键知识点 #### 一、MySQL简介与历史沿革 MySQL是一个开源的关系型数据库管理系统(RDBMS),最初由瑞典的MySQL AB公司开发。它的轻量级、高效性和低成本特性使其成为互联网上中小型网站的理想...

    Mysql 入门知识

    **MySQL入门知识** MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易用性而受到全球开发者的喜爱。...通过不断练习和项目经验积累,你将能熟练掌握并运用MySQL解决实际问题。

    MySQL基础PDF版

    MySQL是世界上最流行的关系型数据库管理系统之一,用于存储和管理数据。本篇主要介绍MySQL的基础...随着经验的积累,还可以深入学习存储过程、触发器、视图、索引优化、性能调优等进阶主题,进一步提升数据库管理能力。

    mysql入门到深入

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。本教程将带你从MySQL的入门到深入,逐步掌握其核心概念和技术。...在实践中不断积累经验,你将成为一名出色的MySQL专家。

    mysql练习使用脚本.zip

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,广泛应用于各种规模的企业和项目中。...在实践中遇到问题时,不要害怕,这是成长的过程,也是积累经验的好机会。祝你在MySQL的学习之路上不断进步!

    MySQL性能优化和高可用架构实践.pptx

    本书深入浅出地讲解了MySQL性能优化的核心原理,包括索引设计、查询优化、缓存策略、高可用架构等方面的知识。同时,结合案例对这些原理进行了生动形象的阐述,方便读者理解和实践。 实践过程 本书详细描述了优化...

    Effective MySQL之SQL语句最优化.pdf

    尽管如此,我将基于标题和描述中提供的关键词“Effective MySQL之SQL语句最优化”来构建知识点。 1. SQL语句最优化的概念:在数据库管理中,对SQL语句进行优化是提高数据库性能的关键环节。最优化的SQL语句能够在...

    大神写的MySQL DBA学习笔记

    通过阅读这份“大神写的MySQL DBA学习笔记”,不仅可以系统地学习MySQL的基础知识,还能获取到作者在实践中积累的宝贵经验,这对于成为一名合格的MySQL DBA至关重要。无论你是初学者还是有一定经验的数据库管理员,...

    mysql面经文档mysql常见面试问题

    本文将深入探讨在面试中可能会遇到的MySQL相关知识点,包括架构、索引、慢查询优化以及备份与恢复策略。 一、MySQL架构 MySQL采用客户端-服务器模型,其中客户端通过网络向服务器发送SQL查询,服务器解析并执行这些...

    MySQL数据库资源学习基础

    在实际工作中,除了理论知识外,积累实践经验也非常重要。例如,可以通过构建小型项目来练习SQL查询、表设计等技能。此外,参与开源项目或社区活动也能帮助加深对MySQL的理解并拓展职业网络。 综上所述,MySQL作为...

    mysql dba 修炼之道

    2. **性能优化**:MySQL DBA需要精通查询优化,包括编写高效的SQL语句,利用索引提升查询速度,以及调整查询计划。此外,了解如何分析慢查询日志并进行性能调优也是关键。 3. **备份与恢复策略**:设计和实施可靠的...

    MySQL数据库应用从入门到精通 第2版

    下面将基于此书的标题、描述以及可能涉及的部分内容,深入探讨与MySQL数据库相关的知识点。 ### MySQL数据库简介 MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle公司。它以其高...

    MySQL入门很简单

    下面将基于这一推测,详细介绍MySQL的基础知识点。 ### MySQL简介 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它使用SQL(Structured Query Language)作为数据查询语言。MySQL因其性能高、稳定性...

Global site tag (gtag.js) - Google Analytics