相关学习推荐:mysql教程
前言mysql索引底层数据结构与算法mysql性能优化原理-前篇实践(1)–mysql性能优化
上一篇 《实践(1)–mysql性能优化》我们讲了数据库表设计的一些原则,explain工具的介绍、sql语句优化索引的最佳实践,本篇继续来聊聊 mysql 如何选择合适的索引。
mysql trace 工具
mysql 最终是否选择走索引或者一张表涉及多个索引,最终是如何选择索引,可以使用 trace 工具来一查究竟,开启 trace工具会影响 mysql 性能,所以只能临时分析 sql 使用,用完之后立即关闭。
案例分析
讲 trace 工具之前我们先来看一个案例:
# 示例表create table`employees`(`id` int(11) not null auto_increment,`name` varchar(24) not null default '' comment '姓名',`age` int(11) not null default '0' comment '年龄',`position` varchar(20) not null default '' comment '职位',`hire_time` timestamp not null default current_timestamp comment '入职时间',primary key (`id`), key `idx_name_age_position` (`name`,`age`,`position`) using btree )engine=innodb auto_increment=4 default charset=utf8 comment='员工记录表'; insert into employees(name,age,position,hire_time)values('zhangsan',23,'manager',now());insert into employees(name,age,position,hire_time)values('hanmeimei', 23,'dev',now());insert into employees(name,age,position,hire_time) values('lucy',23,'dev',now());复制代码mysql 如何选择合适的索引
explain select * from employees where name > 'a';复制代码如果用name索引需要遍历name字段联合索引树,然后还需要根据遍历出来的主键值去主键索引树里再去查出最终数据,成本比全表扫描还高,可以用覆盖索引优化,这样只需要遍历name字段的联合索引树就能拿到所有结果,如下:
explain select name,age,position from employees where name > 'a' ;复制代码explain select * from employees where name > 'zzz' ;复制代码对于上面这两种 name>'a' 和 name>'zzz' 的执行结果,mysql最终是否选择走索引或者一张表涉及多个索引,mysql最终如何选择索引,我们可以用trace工具来一查究竟,开启trace工具会影响mysql性能,所以只能临时分析sql使用,用完之后立即关闭。
trace工具用法开启/关闭trace
#开启traceset session optimizer_trace="enabled=on",end_markers_in_json=on;#关闭traceset session optimizer_trace="enabled=off";复制代码案例1
执行这两句sql
select * from employees where name >'a' order by position;select * from information_schema.optimizer_trace; 复制代码提出来trace值,详见注释
{ "steps": [ { "join_preparation": { --第一阶段:sql准备阶段 "select#": 1, "steps": [ { "expanded_query": "/* select#1 */ select `employees`.`id` as `id`,`employees`.`name` as `name`,`employees`.`age` as `age`,`employees`.`position` as `position`,`employees`.`hire_time` as `hire_time` from `employees` where (`employees`.`name` > 'a') order by `employees`.`position`" } ] /* steps */ } /* join_preparation */ }, { "join_optimization": { --第二阶段:sql优化阶段 "select#": 1, "steps": [ { "condition_processing": { --条件处理 "condition": "where", "original_condition": "(`employees`.`name` > 'a')", "steps": [ { "transformation": "equality_propagation", "resulting_condition": "(`employees`.`name` > 'a')" }, { "transformation": "constant_propagation", "resulting_condition": "(`employees`.`name` > 'a')" }, { "transformation": "trivial_condition_removal", "resulting_condition": "(`employees`.`name` > 'a')" } ] /* steps */ } /* condition_processing */ }, { "substitute_generated_columns": { } /* substitute_generated_columns */ }, { "table_dependencies": [ --表依赖详情 { "table": "`employees`", "row_may_be_null": false,
这个经营范围要写承若书吗腾讯企业产品感恩上海行优质案例前瞻办公移动化买了云服务器怎麽用帮忙看下这个能访问加上访问不了如何创建云服务器ecs域名预定竞价规则是什么?如何选择阿里云服务器配置怎样正确合理的选购BlueHost虚拟主机?