Mysql语句查询优化
2017-11-29 20:51
274 查看
其实对Mysql查询语句进行优化是一件非常有必要的事情。
如何查看当前sql语句的执行效率呢?
1.建一张学生表
2.加入几条测试数据
3.加入查询语句
我们可以看到结果如下:
这时,我们发现了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呢?
很简单,加索引
加完索引之后,在执行
EXPLAIN SELECT * FROM student WHERE stu_age=18
我们发现:
type类型达到ref。这时的sql语句效率就比较高了。
如何查看当前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语句效率就比较高了。
相关文章推荐
- mysql中优化sql语句查询的30种方法
- 30种mysql优化sql语句查询的方法
- mysql单表查询语句优化
- MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适
- mysql优化SELECT语句和其它查询
- MySQL查询语句优化
- 浅谈MySQL中优化sql语句查询常用的30种方法
- Mysql常用30种SQL查询语句优化方法
- 浅谈MySQL中优化sql语句查询常用的30种方法
- 公司一哥们整理的mysql查询语句优化
- mysql 分页查询语句优化
- MYSQL查询语句优化
- mysql查询语句优化
- mysql优化limit查询语句的5个方法
- mysql具体优化查询语句
- [Mysql]SQL 高性能查询优化语句
- MySQL查询语句优化
- Mysql查询语句性能优化
- MySQL中优化sql语句查询常用的30种方法
- 一步一步优化你的mysql------如何优化数据库中的查询语句(一)