`
dsxwjhf
  • 浏览: 73653 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

【转】MySQL 索引原理及慢查询优化

阅读更多
本文转自: http://www.cnblogs.com/alexlo/p/5087015.html

1. 关于磁盘 IO 与预读
考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。

2. 关于索引的作用
每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。

3. B+ 树的性质

  • 1.通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。
  • 2.当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。


4. 建索引的几大原则
  • 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
  • 2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
  • 3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录
  • 4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
  • 5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
  • 大小: 41.3 KB
分享到:
评论

相关推荐

    MySQL索引原理及慢查询优化1

    MySQL索引原理及慢查询优化是数据库管理中的重要主题,尤其是在高并发、大数据量的互联网环境中,优化查询性能对于系统的整体效能至关重要。MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者...

    MySQL索引原理及慢查询优化(2)1

    总结来说,理解MySQL索引的工作原理,尤其是聚簇索引和非聚簇索引的差异,对于优化查询性能至关重要。合理设计主键,选择恰当的索引策略,以及在编写SQL查询时充分考虑索引的使用,都能有效提升数据库系统的整体性能...

    MySQL索引原理及慢查询优化

    总的来说,优化MySQL的慢查询需要结合索引原理、查询优化技巧、数据库设计和运维实践。通过对业务需求的理解,我们可以制定合适的索引策略,改进SQL语句,从而提升数据库的整体性能,满足高并发、大数据量的业务需求...

    美团网技术团队分享的MySQL索引及慢查询优化教程

    本教程将探讨MySQL索引原理和慢查询优化策略。 首先,我们要明白索引的主要目的是提高查询效率。就像字典中的目录,索引帮助快速定位到所需数据,避免全表扫描。对于大型数据集,没有索引的查询可能会导致严重的...

    MySQL索引原理

    ### MySQL索引原理详解 #### 一、索引的基本概念 **索引**是帮助MySQL高效获取数据的数据结构。在数据库中,索引扮演着极其重要的角色,它能够显著提高数据检索的速度,尤其是在处理大规模数据集时尤为重要。索引...

    二、mysql优化技术-定位慢查询

    "二、mysql优化技术-定位慢查询"这一主题聚焦于如何识别和解决性能瓶颈,提升数据库的响应速度。这篇博文可能详细介绍了如何诊断和解决MySQL中的慢查询问题,而`sql.txt`文件很可能包含了一些示例SQL语句或者慢查询...

    Mysql-索引原理分析

    MySQL数据库中的索引是提升查询性能的关键工具,它的工作原理和设计细节对于数据库管理员和开发者来说至关重要。让我们深入探讨一下标题和描述中提及的几个关键概念。 首先,我们来看看索引的存储结构。在MySQL中,...

    mysql索引原理深入解析

    MySQL 索引原理深入解析将带领我们理解数据库索引的工作机制,以及它们如何显著提升查询性能。首先,我们来看一下索引的基本概念。 索引是数据库管理系统中的关键组件,它是一个排序的数据结构,用于加速对数据库表...

    MySQL的or、in、union与索引优化

    ### MySQL的or、in、union与索引优化 在数据库查询优化中,索引的使用至关重要,它能显著提升查询速度。本文将基于一个具体的业务场景来探讨在MySQL中使用`union all`、`in`、`or`以及负向查询(如`!=`)时如何有效...

    MySQL索引分析和优化[定义].pdf

    MySQL索引是数据库管理系统中用于加速数据检索的关键组件。...综上所述,理解MySQL索引的工作原理和类型是优化数据库性能的关键。正确使用和维护索引可以显著提高查询速度,减少资源消耗,从而提升整个应用的响应时间。

    解决MySql大数据Like查询慢的问题

    MySQL 5.6及以上版本支持InnoDB存储引擎的全文索引,它能有效提高模糊查询速度。不过,全文索引对短文本字段效果更好。 3. **使用SOUNDEX或MATCH...AGAINST**:SOUNDEX是一种英文单词的音近字匹配函数,MATCH......

    mysql索引原理之聚簇索引1

    3、B+Tree索引原理: B+Tree是一种适合数据库索引的数据结构,它具有平衡性和有序性。在B+Tree中,所有数据都存储在叶子节点,非叶子节点仅包含索引键,这使得区间查询变得高效。例如,要查找首字母在f到t之间的所有...

    MySQL调优讨论:原理 优化 技巧

    本篇文章将深入探讨MySQL调优的原理、优化策略以及实用技巧,旨在帮助你提升数据库性能,确保系统的稳定性和效率。 一、MySQL调优原理 1. **查询优化**:查询优化是数据库调优的核心,它涉及到SQL语句的编写、索引...

    干货!MySQL常见的面试题+索引原理分析.docx

    MySQL是世界上最受欢迎...综上所述,理解MySQL索引的底层原理和实战经验对于优化数据库性能和解决慢查询问题至关重要。在面试中,具备这些知识不仅能展现对数据库系统的深入理解,也能帮助你在解决实际问题时游刃有余。

    mysql慢查询工具Anemometer

    MySQL的慢查询日志是数据库性能优化的重要工具,它记录了执行时间超过预设阈值的所有SQL查询。Anemometer,作为一个专为MySQL设计的慢查询分析工具,可以帮助数据库管理员更有效地理解和解决性能问题。 Anemometer...

    MYSQL索引和优化详细说明教程

    MySQL索引和优化是数据库管理中的关键环节,它直接影响到数据查询的速度和效率。本教程将详细介绍MySQL中的索引类型及其优化策略。 首先,我们需要理解什么是索引。索引是数据库为了快速查找特定记录而创建的一种...

    MySQL千万级大表深度分页为什么慢,以及优化的方法、原理

    【MySQL千万级大表深度分页慢的原因及优化方法】 在MySQL中,处理千万级大表的深度分页查询时,通常会遇到性能问题。这是因为MySQL的查询优化器在面对大量数据的分页请求时,可能选择全表扫描而不是利用索引来提高...

    MySQL数据库索引优化

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

Global site tag (gtag.js) - Google Analytics