java操作mysql索引_MySql如何使用索引(一)

我们都知道在 MySql 中使用索引可以提高查询效率,但有时候真正执行Sql查询的时候却没有按照我们的预想使用索引,而是全表扫描,导致有慢Sql影响了整个网站的效率,甚至导致网站崩溃,所以我们需要了解Mysql是如何选择使用索引的,以便建立合适的索引 (本文基于MySql5.7,InnoDB引擎)

前提:建立一张测试表

假设有一张用户表

CREATE TABLE `test_user` (

`user_id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL DEFAULT '',

`birthday` date NOT NULL,

`sex` tinyint(1) DEFAULT NULL,

`height` int(11) NOT NULL,

`weight` int(11) NOT NULL,

PRIMARY KEY (`user_id`),

KEY `idx_name_height_weight` (`name`,`height`,`weight`),

KEY `idx_height` (`height`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们建立了name,height,weight 的联合索引,插入测试数据

INSERT INTO `test_user` (`user_id`, `name`, `birthday`, `sex`, `height`, `weight`)

VALUES

(1, 'Tony', '1991-01-01', 1, 176, 65),

(2, 'Mary', '1989-12-19', 2, 160, 50),

(3, 'Tom', '1996-05-29', 1, 180, 70),

(4, 'Kiven', '1994-08-09', 1, 190, 80),

(5, 'John', '1992-11-12', 1, 182, 75);

执行什么操作的时候Mysql会使用索引

查找与WHERE子句匹配的行

select * from test_user where name='mary'

查看执行计划

4e4c8106aa8892a7048390c075739357.png 可见使用了idx_name_height_weight索引

从表中删除一行数据

DELETE from test_user where name='mary';

查看执行计划

9de7d2ff147fe233133a822d93d3c2aa.png

查找索引列的MIN()或MAX()的值

SELECT MIN(height) FROM `test_user`

3501aaf877419c15d18086eb8881c629.png 这个和之前的执行计划不太一样,Select tables optimized away(选择要优化的表)实际就是优化到不能再优化的意思,在这种情况下,MySql把每个Key的MIN() 和 MAX()值替换成一个常量,如果查到了这个常量就立即返回,然后看下面的例子,分别在索引列上和非索引列上使用MIN()函数的执行计划:

SELECT MIN(height) from `test_user` where height>=176 AND height<=190;

ef5b555b42f223087e0479b40b366961.png

SELECT MIN(height) from test_user where sex=1;

66e7bbbf627057c60223e20cc773bdb4.png

在索引列上执行 SORT 或 ORDER BY 操作

SELECT name,height from test_user ORDER BY `name` DESC;

496980fc52d26555915d1b1bba70b770.png

注意SELECT的字段能匹配索引列,比如:

8d0530c918e6e83b0d3c4dd13aecd9df.png

将会出现Using filesort,Using filesort 是Mysql里一种速度比较慢的外部排序,应当尽量避免

本文讲述了MySql什么时候会使用索引,下章说明什么时候MySql不能使用索引,敬请期待

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值