mysql查询优化

 **用来加速数据库查询的技术有很多,但是最重要的方式就是为表建立索引。如果说你抛开索引这个方法而去通过其他方式去优化查询速度,那纯粹就是在浪费时间。下面先说说索引带来的优点**:
    1、索引是一种已经排好了顺序,也就是索引值是有序的,但是没有索引值的字段值是无序状态的,当你要搜索一个没有建立索引的表时,数据库会全盘扫描表中的每一行数据,直到最后一行。但是当你为该表增加索引之后,数据库会使用各种技术来快速定位索引值。比如这个索引表,如果你想要找female中位置是3的数据行,因为索引已经排好顺序了,3已经是当中最小的了,查询将结束。

2、在多表联合查询查询时,索引的优点更是被放大。比如你要在t1,t2,t3 三张表中查询每个字段相等的数据。比如:
    select t1.i1,t2.i2,t3.i3

    from t1 inner join t2 inner join t3

    where  t1.i1=t2.i2 andt2.i2= t3.i3; 

假设每个表有1000行,那么可能的组合有1000*1000*1000种,这可是一种巨大的浪费,假设用了索引,那么我们只需要t1进行全盘扫描就其他两个表可以通过索引查找,这个查询方式比不用索引快乐100万倍。这种优化效果可想而知。

接下来介绍一下几种常见的索引场合

1、索引可以加快where字句的查询以及连接表中的查询,加快搜索的速度

2、对于使用MIN()或者MAX()、order by 、group by字句可以高效地查找以及分类和分组

3、只查询索引表里面的数据,不想查询其他数据行的值,这就跟电脑装了固态一样,直接在固态里面拿数据了

上面把索引说的那么好,但是其实也是有一点代价的,只是这种代价被索引的优点所掩盖了,不可能为了代价不去用索引,了解代价只是为了更加高效地使用索引而已。索引的代价分为时间代价和空间代价。
1、时间代价在查询上为我们提高了速度,但是在插入、删除、更新数据的时候,不单只是考虑插入数据、删除数据、更新数据了,还要为更改索引花费时间,但是有什么所谓了呢,我们大部分的时间都在查询数据是吧。
2、空间上的代价就比较明显了,InnoDB存储引擎将行与索引值分开放置,但是InnoDB引擎只是用一个表空间,管理所有的数据存储以及索引存储,这样很容易达到表的上限。(即使InnoDB引擎不会受到操作系统文件大小限制)
接下来就要选择合适的索引了
1、为用于搜索、排序或者分组的列创建索引。对于一些输出展示的列可以不用创建索引。也就是对于where子句后面的查询条件以及排列条件进行创建索引
2、选择重复值少的字段设置索引。比如对于性别字段,不是男就是女重复性非常大。索引毫无用处。
3 、选择索引短小值。如果你将文章内容建立索引,那就是一种不明智的选择,这么长的值会让数据库引擎很难堪的。短小的值索引速度快,可以减少对I/O请求。
4、索引字符串的前缀。根据第三个要求的特点,可以选择将长的数值截取前面的字符(前面字符尽量能代表唯一性),作为索引。
5、利用最左前缀。这是对于创建包含n列的符合索引。比如一个符合索引包括(x1,x2,x3),则下面三种情况都可以充分利用索引

  x1,x2,x3

    x1,x2

    x1
6、不要建立过多的索引,这个在代价里面阐述过了,不是越多越好,要懂得高效实用

7、利用慢查询日志找出那些性能低下的查询。在日志中频繁出现的查询可能不是最优查询,应该考虑优化

这是在如何建立索引上的优化,接下来一章将讲述如何利用索引在程序上进行优化。谢谢观赏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值