Mysql语句查询优化

其实对Mysql查询语句进行优化是一件非常有必要的事情。

如何查看当前sql语句的执行效率呢?

1.建一张学生表

1 CREATE TABLE `student` (
2   `stu_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号(主键id)',
3   `stu_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '学生姓名',
4   `stu_age` tinyint(4) DEFAULT NULL COMMENT '学生年龄',
5   PRIMARY KEY (`stu_id`)
6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='学生表';

2.加入几条测试数据

1 INSERT INTO `test`.`Student` (`stu_id`, `stu_name`, `stu_age`) VALUES ('1', '岳云鹏', '18');
2 INSERT INTO `test`.`Student` (`stu_id`, `stu_name`, `stu_age`) VALUES ('2', '薛之谦', '19');
3 INSERT INTO `test`.`Student` (`stu_id`, `stu_name`, `stu_age`) VALUES ('3', '郭德纲', '28');
4 INSERT INTO `test`.`Student` (`stu_id`, `stu_name`, `stu_age`) VALUES ('4', '范冰冰', '20');
5 INSERT INTO `test`.`Student` (`stu_id`, `stu_name`, `stu_age`) VALUES ('5', '李晨', '35');

3.加入查询语句

EXPLAIN

SELECT * FROM student WHERE stu_age=18

我们可以看到结果如下:

这时,我们发现了EXPLAIN。那么EXPLAIN的作用是干嘛的呢?

EXPLAIN显示了mysql如何使用索引来处理select语句以及连接表。也就是校验sql语句是否使用了索引,以及sql语句的查询效率。

EXPLAIN 列的解释

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和all

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句

key: 实际使用的索引。如果为null,则没有使用索引。很少的情况下,mysql会选择优化不足的索引。这种情况下,可以在select语句中使用use index(indexname)来强制使用一个索引或者用ignore index(indexname)来强制mysql忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:mysql认为必须检查的用来返回请求数据的行数

extra:关于mysql如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是using temporary和using filesort,意思mysql根本不能使用索引,结果是检索会很慢

EXPLAIN列的解释详细描述请查看

其中有一列需要我们特别关注的,那就是type列

Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

type:ALL 表示全表查询,这在sql查询中是杜绝的。那怎么优化type至少达到ref呢?

很简单,加索引

ALTER TABLE student ADD INDEX student_stuAge ( `stu_age`)

加完索引之后,在执行 EXPLAIN SELECT * FROM student WHERE stu_age=18

我们发现:

type类型达到ref。这时的sql语句效率就比较高了。

只是针对索引方面的sql优化,希望对你有帮助!也欢迎大家多提提意见

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

MySQL(十五)DDL之常见的约束

18740
来自专栏PHP在线

MySQL索引类型一览 让MySQL高效运行起来

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高...

35650
来自专栏Java呓语

第13.1.1章 语法解释ALTER DATABASE

ALTER DATABASE 允许修改数据库的特征,所有关于数据库的特征都存储在db.opt文件中。你必须先具备该数据库的ALTER特权,才能完成对数据库的AL...

8510
来自专栏撸码那些事

MySQL——索引优化实战

上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战。在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要。

9740
来自专栏性能与架构

Mysql DISTINCT的实现思路

DISTINCT实际上和GROUP BY操作非常相似,只不过是在GROUP BY之后的每组中只取出一条记录而已 所以,DISTINCT的实现方式和GROUP B...

38470
来自专栏撸码那些事

MySQL——索引优化实战

上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战。在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要。

15520
来自专栏battcn

MySQL - 索引详解

索引依托于存储引擎的实现,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。所有存储引擎支持每个表至少16个索引,总索引长度至...

14120
来自专栏小白安全

小白博客 MYSQL常用语句

用户管理: 1、新建用户: >CREATE USER name IDENTIFIED BY ‘ssapdrow’; 2、更改密码: >...

32090
来自专栏数据库

开发篇-MySQL分区(一)

MySQL从5.1版本开始支持分区的功能。分区是指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一...

24570
来自专栏土豆专栏

Java面试之数据库常用语句

>id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, //id值,无符号、非空、递增——唯一性,可做主键。

19870

扫码关注云+社区

领取腾讯云代金券