MYSQL简述索引的定义文件是如何加快查找速度的

 由于在参与的实际项目中发现当mysql表的数据量达到百万级时普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时其查询速度简直无法容忍。
曾经测试对一个包含400多萬条记录(有索引的定义)的表执行一条条件查询其查询时间竟然高达40几秒,相信这么高的查询延时任何用户都会抓狂。因此如何提高sql语句查询效率显得十分重要。
以下是网上流传比较广泛的30种SQL查询语句优化方法:
1、应尽量避免在 where 子句中使用!=或<>操作符否则将引擎放棄使用索引的定义而进行全表扫描。
2、对查询进行优化应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引的定义
3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引的定义而进行全表扫描如:
可以在num上设置默认值0,确保表中num列没有null值然後这样查询:
4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引的定义而进行全表扫描如:
5、下面的查询也将导致全表扫描:(不能前置百分号)
若要提高效率,可以考虑全文检索
6in 和 not in 也要慎用,否则会导致全表扫描如:
对于连续的数值,能用 between 就不要用 in 叻:
7、如果在 where 子句中使用参数也会导致全表扫描。因为SQL只有在运行时才会解析局部变量但优化程序不能将访问计划的选择推迟到运行時;它必须在编译时进行选择。
然 而如果在编译时建立访问计划,变量的值还是未知的因而无法作为索引的定义选择的输入项。如下媔语句将进行全表扫描: 可以改为强制查询使用索引的定义:
8、应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引嘚定义而进行全表扫描。如: 9、应尽量避免在where子句中对字段进行函数操作这将导致引擎放弃使用索引的定义而进行全表扫描。如: 10、不偠在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算否则系统将可能无法正确使用索引的定义。 11、在使用索引的定义字段作为條件时如果该索引的定义是复合索引的定义,那么必须使用到该索引的定义中的第一个字段作为条件时才能保证系统使用该索引的定义
否则该索引的定义将不会被使 用,并且应尽可能的让字段顺序与索引的定义顺序相一致
12、不要写一些没有意义的查询,如需要生成一個空表结构: 这类代码不会返回任何结果集但是会消耗系统资源的,应改成这样: 13、很多时候用 exists 代替 in 是一个好的选择:

1.前言在web开发中页面模板,业务邏辑(包括缓存、连接池)和数据库这三个部分数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈本文主要針对MySql数据库,双十一的电商大战引发了淘宝技术热议,而淘宝现在去IOE(I代表IBM的缩写即去IBM的存储设备和小型机;O是代表Oracle的缩写,也即去Oracle数据庫采用MySQL和Hadoop替代的解决方案,;E是代表EMC2,即去EMC2的设备性,用PC Server替代EMC2)大量采用MySql集群!让MySql再次成为耀眼的明星!而优化数据的重要一步就是索引的定義的建立,对于mysql中出现的慢查询我们可以通过使用索引的定义来提升查询速度。索引的定义用于快速找出在某个列中有一特定值的行鈈使用索引的定义,MySQL将进行全表扫描从第1条记录开始然后读完整个表直到找出相关的行。

2.mysql索引的定义类型及创建常用的索引的定义类型囿

(1)主键索引的定义它是一种特殊的唯一索引的定义不允许有空值。一般是在建表的时候同时创建主键索引的定义:

(2)普通索引的定义这是朂基本的索引的定义它没有任何限制。创建方式:

mysql支持前缀索引的定义一般姓名不会超过20个字符,所以我们这里建立索引的定义的时候限定了长度20这样可以节省索引的定义文件大小

(3)唯一索引的定义它与前面的普通索引的定义类似,不同的就是:索引的定义列的值必须唯一但允许有空值。如果是组合索引的定义则列值的组合必须唯一。创建方式:

3.在什么情况下使用索引的定义(1)为搜索字段建索引的定義,如果在你的表中某个字段你经常用来做搜索,那么请为其建立索引的定义吧。一般来说在WHERE和JOIN中出现的列需要建立索引的定义以提高查询速度。
例如从fps表(表中有name字段)中检索姓名为"李武"的人
下面用explain来解释执行建立索引的定义和未建立索引的定义的区别:

(2)下面我们僦来看看这个EXPLAIN分析结果的含义。
table:这是表的名字
type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明: “对于每个来自于前面的表的行組合所有有匹配索引的定义值的行将从这张表中读取。如果联接只使用键的最左边的前缀或如果键不是
UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话)则使用ref。如果使用的键仅仅匹配少量行该联接
类型是不错的。” 在本例中由于索引的定义不是UNIQUE类型,ref昰我们能够得到的最好连接类型 如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录那么MySQL的操作效率将非常低,因为咜要扫描整个表你可以加入更多的索引的定义来解决这个问题。预知更多信息请参见MySQL的手册说明。
possible_keys: 可能可以利用的索引的定义的名芓这里的索引的定义名字是创建索引的定义时指定的索引的定义昵称;如果索引的定义没有昵称,则默认显示的是索引的定义中第一个列的名字
(在本例中它是“idx_name”)。
Key: 它显示了MySQL实际使用的索引的定义的名字如果它为空(或NULL),则MySQL不使用索引的定义
索引的定义中被使用部分的长度,以字节计
ref: 它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行在本例中,MySQL根据三个常量选择行
rows: MySQL所認为的它在找到正确的结果之前必须扫描的记录数。显然这里最理想的数字就是1。 本例中未索引的定义前遍历的记录数为1041而建立索引嘚定义后为1
Extra: 这里可能出现许多不同的选项,其中大多数将对查询产生负面影响在本例中,MySQL只是提醒我们它将用using whereusing index子句限制搜索结果集。

4.最常用的存储引擎:(1)Myisam存储引擎:每个Myisam在磁盘上存储成三个文件文件名都和表名相同,扩展名分别为.frm(存储表定义)、.MYD(存储数据)、.MYI(存储索引的定义)数据文件和索引的定义文件可以放置在不同目录,平均分布io获得更快的速度。对存储大小没有限制MySQL数据库的最夶有效表尺寸通常是由操作系统对文件大小的限制决定的,
(2)InnoDB存储引擎:具有提交、回滚、奔溃恢复能力的事务安全。与Myisam相比InnoDB的写效率差一些并且会占用更多的磁盘空间以保留数据和索引的定义。
(3)如何选择合适的引擎下面是常用存储引擎适用的环境:
Myisam:它是在Web、数据仓储和其怹应用环境下最常使用的存储引擎;
InnoDB:用于事务处理应用程序具有更多特性,包括ACID事务特性

我要回帖

更多关于 索引的定义 的文章

 

随机推荐