首页 数据库 mysql教程 【mysql】索引的优化_MySQL

【mysql】索引的优化_MySQL

May 30, 2016 pm 05:10 PM
索引

mysql结构

 

从MySQL逻辑架构来看,MySQL有三层架构,第一层连接,第二层查询解析、分析、优化、视图、缓存,第三层,存储引擎

【mysql】索引的优化_MySQL

MySQL有哪些索引类型 ?

 

从数据结构角度

 

1、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理http://www.bitsCN.com/database/201504/393729.html,http://www.bitsCN.com/database/201504/393710.html

 

2、hash索引:

 

a 仅仅能满足"=","IN"和""查询,不能使用范围查询

 

b 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引

 

c 只有Memory存储引擎显示支持hash索引

 

3、FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)

 

4、R-Tree索引(用于对GIS数据类型创建SPATIAL索引)

 

从物理存储角度

 

1、聚集索引(clustered index)

 

2、非聚集索引(non-clustered index)

 

从逻辑角度

 

1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值

 

2、普通索引或者单列索引

 

3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合

 

4、唯一索引或者非唯一索引

 

5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。

 

MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

 

CREATE TABLE table_name[col_name data type]

[unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]

 

1、unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;

 

2、index和key为同义词,两者作用相同,用来指定创建索引

 

3、col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;

 

4、index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;

 

5、length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;

 

6、asc或desc指定升序或降序的索引值存储

 

建立索引的原则

 

1、基数很低的字段不创建索引,更新非常频繁的字段不适合创建索引

 

2、MySQL不支持bitmap索引

 

3、采用第三方系统实现 Text/Blob 的全文索引(Sphinx、Coreseek、Lucene、ElashSearch)

 

4、常用的 where、ORDER BY 、GROUP BY 、DISTINCT 字段要建立索引

 

5、索引不能太多,会有负作用

 

6、多使用联合索引、少使用独立索引

 

7、字符型可创建前缀索引(如 username 字段 80% 的数据都小于18个字符,那么可以创建18个字符的前缀索引

 

8、字段的顺序对组合索引效率有至关重要的作用,过滤效果越好的字段需要更靠前

 

最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

 

9、MySQL只对以下操作符才使用索引

 

,>=,between,

 

某些时候的like(不以通配符%或_开头的情形)

 

若已对名为col_name的列建了索引,则形如"col_name is null"的SQL会用到索引

若sql语句中的where条件不只1个条件,则MySQL会进行Index Merge优化来缩小候选集范围

 

10、不要过度索引,只保持所需的索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。 在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。

 

无法使用索引的场景

 

1、通过索引扫描的记录数超过30%会进行全表扫描

 

2、第一个索引列使用范围查询不能使用索引

 

3、内存表使用Hash进行全表扫描

 

4、ORDER BY 、GROUP BY Hash索引只能进行等于/不等于的检索

 

5、SELECT … WHERE key1 = ? ORDER BY key2 ASC 对于key1和key2上的索引,查询优化器会自己判断用哪个(只能用到一个)

 

6、表关联字段类型要一样(包括长度),否则会有类型转换

 

7、使用函数时不能用到索引( WHERE func(key1) = ? 不能用到)( WHERE key1 + 1 = ? 不能用到)(WHERE key1 = ? + ? 可以用到)

 

索引有哪些“副作用”

1、增,删,改都需要修订索引,索引存在额外的维护成本

 

2、查找翻阅索引系统需要消耗时间,索引存在额外的访问成本

 

3、索引系统需要一个地方来存放,索引存在额外的空间成本

 

索引工具

mysqlidxchx/pt-index-usage/userstat/check-unused-keys

 

1、mysqlidxchx工具很长时间没有更新,但主要用来分析general log、slow.log,来判断实例中那个索引是可以删除,但这个工具没有经过实战,风险很大。

 

2、pt-index-usage原理来类似mysqlidxchx,执行过程中性能消耗比较严重,如果要在生产库上部署,最好在凌晨业务低锋时使用,pt-index-usage只支持slow.log格式的文件,如果要全面分析整个实例索引使用情况,需要long_query_time设置成0,才能把所以的sql记录下来,但同时会对磁盘空间造成压力,同时pt-index-usage对大文件分析就是件痛苦的事。当然pt-index-usage可以考虑部分表索引使用情况的确认。

 

3、最看好的userstat,收集信息性能优越,成本低。这个patch是google贡献的(userstat_running),percona把它改名成userstat,默认是不开启的,开启是会收集客户端、索引、表、线程信息存储在CLIENT_STATISTICS、INDEX_STATISTICS、TABLE_STATISTICS、THREAD_STATISTICS。Userstat的bug导致的问题太严重,直接导致mysql crash,到目前淘宝生产环境还没有使用。

 

4、Ryan Lowe的check-unused-keys脚本基于userstat,能够比较方便输出需要删除的索引。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在 Windows 11 上修复 100% 的磁盘使用率 如何在 Windows 11 上修复 100% 的磁盘使用率 Apr 20, 2023 pm 12:58 PM

如何在Window11上修复100%的磁盘使用率查找导致100%磁盘使用的有问题的应用程序或服务的直接方法是使用任务管理器。要打开任务管理器,请右键单击开始菜单并选择任务管理器。单击磁盘列标题,查看占用最多资源的内容。从那里开始,您将很好地了解从哪里开始。但是,问题可能比仅仅关闭应用程序或禁用服务更严重。继续阅读以查找问题的更多潜在原因以及如何解决这些问题。禁用SuperfetchSuperfetch功能(在Windows11中也称为SysMain)有助于通过访问预取文件来减少启动时

如何在 Windows 11 中隐藏文件和文件夹并从搜索中移除? 如何在 Windows 11 中隐藏文件和文件夹并从搜索中移除? Apr 26, 2023 pm 11:07 PM

如何在Windows11上从搜索中隐藏文件和文件夹我们首先要看的是自定义Windows搜索文件的位置。通过跳过这些特定位置,您应该可以更快地看到结果,同时还可以隐藏您想要保护的任何文件。如果要从Windows11上的搜索中排除文件和文件夹,请使用以下步骤:

以下是6种修复Windows 11搜索栏不可用的方法。 以下是6种修复Windows 11搜索栏不可用的方法。 May 08, 2023 pm 10:25 PM

如果您的搜索栏在Windows11中不起作用,有几种快速方法可以立即启动并运行!任何微软操作系统有时都可能遇到故障,最新的操作系统不能免除该规则。此外,正如Reddit上的用户u/zebra_head1所指出的那样,同样的错误出现在Windows11的22H2Build22621.1413上。用户抱怨切换任务栏搜索框的选项随机消失。因此,您必须为任何情况做好准备。为什么我无法在计算机上的搜索栏中键入内容?无法在计算机上键入可归因于不同的因素和过程。以下是您应该注意的一些事项:Ctfmon.

oracle索引类型有哪些 oracle索引类型有哪些 Nov 16, 2023 am 09:59 AM

oracle索引类型有:1、B-Tree索引;2、位图索引;3、函数索引;4、哈希索引;5、反向键索引;6、局部索引;7、全局索引;8、域索引;9、位图连接索引;10、复合索引。详细介绍:1、B-Tree索引,是一种自平衡的、可以高效地支持并发操作的树形数据结构,在Oracle数据库中,B-Tree索引是最常用的一种索引类型;2、位图索引,是一种基于位图算法的索引类型等等。

Windows 11 Outlook 搜索不工作:6 个修复方法 Windows 11 Outlook 搜索不工作:6 个修复方法 Apr 22, 2023 pm 09:46 PM

在Outlook中运行搜索和索引疑难解答您可以开始的更直接的修复之一是运行搜索和索引疑难解答。要在Windows11上运行疑难解答,请执行以下操作:单击开始按钮或按Windows键并从菜单中选择设置。当设置打开时,选择系统>疑难解答>其他疑难解答。在右侧向下滚动,找到SearchandIndexing,然后单击Run按钮。选择Outlook搜索不返回结果并继续屏幕上的说明。当您运行它时,疑难解答程序将自动识别并修复问题。运行疑难解答后,打开Outlook并查看搜索是否正常。如

索引超出了数组界限如何解决 索引超出了数组界限如何解决 Nov 15, 2023 pm 05:22 PM

解决方法有:1、检查索引值是否正确:首先确认你的索引值是否超出了数组的长度范围。数组的索引从0开始,所以最大索引值应该是数组长度减1;2、检查循环边界条件:如果是在循环中使用索引进行数组访问,要确保循环的边界条件正确;3、初始化数组:在使用数组之前,要确保数组已经被正确地初始化;4、使用异常处理:在程序中可以使用异常处理机制来捕获索引超出数组界限的错误,并进行相应的处理。

PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串 PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串 Mar 21, 2024 am 10:31 AM

这篇文章将为大家详细讲解有关PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP中使用substr()函数从字符串中提取子字符串substr()函数可从字符串中提取指定范围内的字符。其语法如下:substr(string,start,length)其中:string:要从中提取子字符串的原始字符串。start:子字符串开始位置的索引(从0开始)。length(可选):子字符串的长度。如果未指定,则提

如何通过索引提升PHP与MySQL的数据分组和数据聚合的效率? 如何通过索引提升PHP与MySQL的数据分组和数据聚合的效率? Oct 15, 2023 am 11:39 AM

如何通过索引提升PHP与MySQL的数据分组和数据聚合的效率?引言:PHP和MySQL是目前应用最广泛的编程语言和数据库管理系统,常常被用于构建web应用程序和处理大量数据。在处理大量数据时,数据分组和数据聚合是常见的操作,但如果不合理地设计和使用索引,这些操作可能会变得非常低效。本文将介绍如何通过索引来提升PHP与MySQL的数据分组和数据聚合的效率,并提

See all articles