`
san_yun
  • 浏览: 2653726 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

MySQL索引 使用笔记

 
阅读更多

参考:http://www.perfgeeks.com/?p=460

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的B-Tree索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。

MySQL InnoDB B-Tree索引使用Tips

这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用。B-Tree索引主要作用于WHERE和ORDER BY子句。这里讨论的均在MySQL-Server-5.1.38测试

 

CREATE TABLE `friends` (
`ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
`fuid` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
`fname` varchar(50) NOT NULL DEFAULT '',
`fpicture` varchar(150) NOT NULL DEFAULT '',
`fsex` tinyint(1) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ALTER TABLE `friends` ADD INDEX uid_fuid (uid, fuid);
 

 

1.如果索引了多列,要遵守最左前缀法则。 所谓最左前列,指的是查询从索引的最左前列开始,并且不跳过索引中的列。

第2条语句,从索引的第二列开始查找,使用索引失败,导致MySQL采用ALL访问策略,即全表查询.在开发中,应该尽量避免全表查询。
2.当MySQL一旦估计检查的行数可能会”太多”,范围查找优化将不会被使用。

第2条语句使用了全表查询,它与第1条语句唯一的区别在于需要检查的行数远远多于第1条语句。在应用中,可能不会碰到这么大的查询,但是应该避免这样的查 询出现: select uid from users where registered < 1295001384
3.索引列不应该作为表达式的一部分,即也不能在索引列上使用函数

第2和3条语句都有使用表达式,索引派不上用场。
4.尽量借用覆盖索引 ,减少select * from …语句使用

第1句Extra中使用了Using index表示使用了覆盖索引。第3句也使用了覆盖索引,虽然ID不在索引uid_fuid索引列中,但是InnoDB二次索引(second index)叶子页的值就是PK值,不同于MyISAM。Extra部分的Using index表示应用了索引,不要跟type中的index混淆。第2句没有使用覆盖索引,因为fsex不在索引中。
5.ORDER BY子句,尽量使用Index方式排序 ,避免使用FileSort方式排序
MySQL支持二种方式的排序,FileSort和Index,后者效率高,它指MySQL扫描索引本身完成排序。FileSort方式效率较低。ORDER BY满足以下情况,会使用Index方式排序:
  a)ORDER BY 语句使用索引最左前列。参见第1句
  b)使用Where子句与Order BY子句条件列组合满足索引最左前列。参见第2句.
以下情况,会使用FileSort方式的查询

a)检查的行数过多,且没有使用覆盖索引。 第3句,虽然跟第2句一样,order by使用了索引最左前列uid,但依然使用了filesort方式排序,因为status并不在索引中,所以没办法只扫描索引。
b)使用了不同的索引,MySQL每回只采用一个索引. 第4句,order by出现二个索引,分别是uid_fuid和聚集索引(pk)
c)对索引列同时使用了ASC和DESC。 通过where语句将order by中索引列转为常量,则除外。 第5句,和第6句在order by子句中,都出现了ASC和DESC排序,但是第5句却使用了filesort方式排序,是因为第6句where uid取出排序需要的数据,MySQL将其转为常量,它的ref列为const。
d)where语句与order by语句,使用了不同的索引。 参见第8句。
e)where语句或者ORDER BY语句中索引列使用了表达式,包括函数表达式。 参见第9句
f)where 语句与ORDER BY语句组合满足最左前缀,但where语句中使用了条件查询。 查见第10句,虽然where与order by构成了索引最左有缀的条件,但是where子句中使用的是条件查询。
g)order by子句中加入了非索引列,且非索引列不在where子句中。
h)order by或者它与where组合没有满足索引最左前列 。参见第11句和12句,where与order by组合,不满足索引最左前列. (uid, fsex)跳过了fuid
i)当使用left join,使用右边的表字段排序。 参见第13句,尽管user.uid是pk,依然会使用filesort排序。



6.慎用left join语句,避免创建临时表 使用left join语句的时候,避免出现创建临时表。尽量不要用left join,分而治之。非要使用的时候,要询问自己是不是真要必须要使用。

7.高选择性索引列 。 尽量使用高选择性的过引来过滤数据。高选择性指Cardinality/#T越接近1,选择性越高,其中Cardinality指表中索引列不重复值(行)的总数。PK和唯一索引,具有最高的选择性,即1。推荐可选性达到20%以上。

这里有二个索引可供使用,而MySQL选择PRIMARY,是因为它具有更高的选择性。
8.谨防where子句中的OR 。where语句使用or,且没有使用覆盖索引,会进行全表扫描。应该尽量避免这样OR语句。尽量使用UNION代替OR

第1句虽然使用了索引,但是查行时间依然不可以恭维,mysql要检查的行很多,但是返回的行却很少.Extra中的using where表示需要通过where子句扔弃不需要的数据行。
9.LIMIT与覆盖索引 limit子句,使用覆盖索引时比没有使用覆盖索引会快很多

附件

1. MySQL Explain , 这里附一份由网友胡中泉分享的Explain的PPT,我认为写得很好

分享到:
评论

相关推荐

    mysql索引笔记1

    MySQL 是一种广泛使用的开源关系型数据库管理系统,其索引机制对于提升查询性能至关重要。本文将深入探讨MySQL中的索引及其相关知识点。 首先,我们来了解索引的优点和缺点。索引如同书籍的目录,能够快速定位到...

    数据库 MySQL 学习笔记高级篇.md

    数据库 MySQL 学习笔记高级篇.md

    尚硅谷mysql笔记.zip

    笔记会解释B-Tree、Hash、R-Tree等不同类型的索引,以及如何创建、使用和优化索引。 5. 事务处理:事务是数据库操作的基本单位,确保数据的一致性和完整性。笔记将解释ACID(原子性、一致性、隔离性、持久性)属性...

    MySQL优化文档笔记

    应选择最小且能满足需求的数据类型,如使用`TINYINT`代替`BIGINT`,避免使用`NULL`,因为`NULL`值处理起来更复杂,且可能影响索引效率。对于字符串类型,`VARCHAR`适合存储长度变化大的内容,而`CHAR`适合存储长度...

    mysql优化笔记+资料

    这些笔记涵盖了MySQL优化的主要方面,包括查询优化、SQL编写技巧、数据库设计、存储引擎选择、服务器配置、硬件升级、定期维护以及使用各种工具进行监控和调优。通过这些方法,你可以有效地提升MySQL数据库的运行...

    大神写的MySQL DBA学习笔记

    2. **数据类型与表结构**:MySQL中的数据类型如INT、VARCHAR、DATE等,以及如何设计高效的表结构,包括主键、外键、索引的合理使用。 3. **SQL查询语言**:深入理解SQL语法,包括SELECT、INSERT、UPDATE、DELETE等...

    mysql索引和执行计划的使用

    MySQL索引的最佳实践和执行计划的使用分析,包括索引的设计原则,SQL语句的优化原则等

    狂神MySQL笔记.rar

    这份笔记旨在帮助读者系统地理解和掌握MySQL的使用,提升数据库管理与开发能力。 笔记首先会介绍MySQL的基础概念,包括数据库和表的创建、数据类型的选择、SQL语言的基本语法,如SELECT、INSERT、UPDATE和DELETE...

    深入浅出MySQL-读书笔记byCZF

    MySQL是目前流行和广泛使用的开源关系型数据库管理系统,它在性能上有着出色的表现,成为众多开发者和企业的首选。在MySQL数据库的使用过程中,有多个关键的知识点需要掌握,以保障数据库的高效稳定运行。 首先,...

    MySQL高级笔记.zip

    笔记目录: P1 day01-02. MySQL 高级 - Linux上安装MySQL P2 day01-03. MySQL 高级 - 启动及登录MySQL P3 day01-04. MySQL 高级 - 索引 - 概述 P4 day01-05. MySQL 高级 - 索引 - 优势和劣势 P5 day01-06. MySQL ...

    mysql 个人学习笔记

    这份“MySQL个人学习笔记”涵盖了从基础到进阶的多个方面,旨在帮助学习者全面理解MySQL的使用。 1. **安装与配置**: 在开始学习MySQL之前,你需要了解如何在不同的操作系统上安装MySQL服务器,如Windows、Linux...

    超经典mysql dba 学习笔记.zip

    这份“超经典mysql dba学习笔记”包含了丰富的MySQL运维知识,对于想要深入理解和掌握MySQL DBA技能的人来说是一份宝贵的资料。 一、MySQL基础知识 在学习MySQL DBA之前,首先需要了解MySQL的基本概念,包括数据库...

    Mysql的索引详解学习笔记.zip

    总结,理解和熟练运用MySQL索引是数据库管理的关键技能。通过了解索引原理,选择合适的索引类型,优化索引使用,可以显著提高数据库的查询效率,从而提升整个系统的性能。不断实践和学习,你将成为MySQL索引的专家。

    超经典MySQL DBA培训笔记

    这份“超经典MySQL DBA培训笔记”显然涵盖了MySQL数据库管理的各个方面,是DBA或者对MySQL有兴趣的学习者的重要参考资料。接下来,我将根据这个主题,详细解释MySQL DBA需要掌握的关键知识点。 1. **MySQL基础知识*...

    超经典mysql dba 学习笔记

    本学习笔记聚焦于MySQL这一广泛使用的开源关系型数据库管理系统,为有志成为DBA或者希望提升MySQL技能的读者提供了丰富的知识资源。以下是笔记中可能涵盖的主要知识点: 1. **MySQL简介**:MySQL的历史、特性、版本...

    mysql高性能索引读书笔记

    《高性能Mysql》第五章的读书笔记,记录的都是要点,以思维导图的方式呈现。

    MYSQL开发学习笔记

    ### MySQL开发学习笔记知识点梳理 #### 一、基础知识概述 - **数据库定义**: 数据库(database)是用于存储数据的仓库,它可以高效地存储和处理数据。主要存储介质有两种:磁盘和内存(RAM)。 - **数据库分类**: - *...

    mysql之Linux安装,重点是索引的优化笔记

    ### MySQL之Linux安装与索引优化笔记 #### 一、MySQL简介及Linux版安装 **1. MySQL概述** MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle公司。它是一种开源软件,因其性能...

Global site tag (gtag.js) - Google Analytics