Mysql十大经典案例 索引

案例一索引

  • 无索引案例

问题描述:用户系统打开缓慢,数据库 CPU 100%

问题排查:发现数据库中大量的慢sql,执行时间超过了2S

慢SQL:

SELECT id FROM `user` WHERE user_no=13772556391 LIMIT 0,1;

执行计划:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 707250
Extra: Using where

执行时间:

mysql> SELECT id FROM `user` WHERE user_no=13772556391 LIMIT 0,1; 
Empty set (2.11 sec)

表结构:

CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
    `pid` int(11) unsigned NOT NULL DEFAULT '0' ,
    `email` char(60) NOT NULL ,
    `name` char(32) NOT NULL DEFAULT '',
    `user_no` char(11) NOT NULL DEFAULT '' ,
    PRIMARY KEY (`id`),
    UNIQUE KEY `email` (`email`),
    KEY `pid` (`pid`)
) ENGINE=InnoDB ENGINE=InnoDB AUTO_INCREMENT=972600 DEFAULT CHARSET=utf8;

验证mo字段的过滤性:

mysql> select count(*) from user where user_no=13772556391;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.05 sec)

添加索引:

mysql> alter table user add index ind_user_no (user_no);

执行时间:

mysql>SELECT id FROM `user` WHERE user_no=13772556391 LIMIT 0,1;
Empty set (0.05 sec)

执行计划:

mysql> explain SELECT id FROM `user` WHERE user_no=13772556391 LIMIT 
0,1\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: index
possible_keys: ind_user_no
key: ind_user_no
key_len: 33
ref: NULL
rows: 707250
Extra: Using where; Using index

隐式转换案例

为什么索引的过滤性这么差?

mysql> explain extended select id from`user` where user_no =13772556391 limit 0,1;
mysql> show warnings;
Warning1:Cannot use index 'ind_user_no ' due to type or collation conversion on field 'user_no' 
Note:select `user`.`id` AS `id` from `user` where (`user`.`user_no` = 13772556391) limit 0,1

表结构:

CREATE TABLE `user` (
……
`user_no` char(11) NOT NULL DEFAULT '' ,
……
) ENGINE=InnoDB;
mysql> explain SELECT id FROM `user` WHERE user_no='13772556391' LIMIT 0,1\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: ref
possible_keys: ind_user_no
key: ind_user_no
key_len: 33
ref: const
rows: 1
Extra: Using where; Using index
mysql> SELECT id FROM `user` WHERE user_no='13772556391' LIMIT 0,1;
Empty set (0.00 sec)

索引最佳实践

1、通过explain查看sql的执行计划 
    判断是否使用到了索引以及隐士转换
2、常见的隐式转换
    包括字段数据类型类型以及字符集定义不当导致
3、设计开发阶段
    避免数据库字段定义与应用程序参数定义出现不一致
    不支持函数索引,避免在查询条件加入函数:date(a.gmt_create)
4、SQL审核
    所有上线的sql都要经过严格的审核,创建合适的索引

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jc_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值