mysql useing_mysql中using where,using index

Using where:过滤元素;

执行 explain SELECT * from test where  b = '4'    (b不是索引,全表扫描后,通过过滤获取所需数据)

3c58b43d85079e74b5443691c4360742.png

执行 explain SELECT * from test where  c = '4'    (c是索引,通过索引定位到所需数据,不需过滤)

17e8199a32ecd775ae4d8dcd50589200.png

Using index:查询使用索引就能直接访问索引文件获取到所需要的数据;

执行  explain SELECT c from test where  c = '4' (c是索引)

a5e065aeaba2e49ea10e3a6cb14548a5.png

Using index condition:查询使用索引,但要访问数据文件(表数据)才能获取所需要的数据;

using firesort : order by时,在索引加得不当的情况下,都有可能出现Using filesort,这时候就要对SQL语句和索引进行优化了(个人理解:排序字段不是索引或排序字段是索引但没有用到就会出现using filesort)

using jion buffer(block nested loop):

示例表

CREATE TABLE `test` (

`a` varchar(20) NOT NULL,

`b` varchar(20) DEFAULT NULL,

`c` varchar(20) DEFAULT NULL,

PRIMARY KEY (`a`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `prov` (

`id` varchar(32) NOT NULL,

`name` varchar(255) DEFAULT NULL,

`height` varchar(32) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

执行

SELECT  * FROM test t INNER JOIN prov v on t.c = v.id where v.id

a27e6a84355481e1845cd834d4d563f3.png

说明:

从执行计划中看出v是基表,在查询中使用到了主键v.id,Extra是using where(因为过滤条件v.id

执行 ALTER table test add index inx_c(c) ,给t.c加索引,执行计划如下:

1f55cf54bd9c52816b634095804d5947.png

Extra是using index condition, 因为select *   是要读到表数据,但是使用了索引

执行 SELECT c from test where c = '5';

a72664785642d4c564458113a4e97bea.png

Extra是using index , 因为select c  查找时使用了索引,只从索引中就可得到数据,不用访问表数据

执行 SELECT  * FROM  test t INNER JOIN prov v on t.a = v.id where v.id

6160620cc07e4be706b11e263257373a.png

t表中row=1,因为t.a是主键,所以基表v的每条符合要求记录 与t表关联查询时是通过索引直接定位到符合要求的数据。

参考:http://blog.sina.com.cn/s/blog_5037eacb0102vkcp.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值