2021-01-16 - mysql优化

2021-01-16  本文已影响0人  赤道的飞雪_f6e1

分页优化

表结构如下

CREATE TABLE `employees` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int 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=100001 DEFAULT CHARSET=utf8 COMMENT='员工记录表'

根据主键的查询排序

select * from employees limit 10000,10;

sql查询 会用到索引吗?


image.png
select * from employees where id > 10000 limit   10;

image.png image.png

非主键的排序分页查询

sql查询 会用到索引吗?

select * from employees  ORDER BY name limit 10
select * from employees  ORDER BY name limit 10,10;
select * from employees  ORDER BY name limit 100,10;
select * from employees  ORDER BY name limit 1000,10;
select name from employees  ORDER BY name limit 1000,10  ;
image.png

按照B+Tree的结构,应该会走name字段索引,但是,操作的结果集太多,又要回表等等原因 , MySQL可能不选name 字段的索引 , key 字段对应的值为 null ,从而走了全表扫描 。。

 select * from employees a inner join (select id from employees order by name limit 10000,10) b on a.id = b.id;


image.png image.png

索引优化

select * from employees where name > 'a';
select * from employees where name > 'zzz';
image.png

SQL优化

  1. 条件优化
  2. 计算全表扫描成本
  3. 根据查询条件,找出所有可用的索引
  4. 计算各个索引的访问成本
  5. 选择成本最小的索引以及访问方式

开启查询优化器日志

为了能查看查询优化器优化的细节,我们需要开启查询优化器日志。

--开启
set optimizer_trace="enabled=on";

--执行sql
--查询日志信息
select * from information_schema.OPTIMIZER_TRACE;

--关闭
set optimizer_trace="enabled=off";

{
    "steps": [
        {
            "join_preparation": {
                "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` limit 0,200"
                    }
                ]
            }
        },
        {
            "join_optimization": {
                "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')"
                                }
                            ]
                        }
                    },
                    {
                        "substitute_generated_columns": {}
                    },
                    {
                        "table_dependencies": [
                            {
                                "table": "`employees`",
                                "row_may_be_null": false,
                                "map_bit": 0,
                                "depends_on_map_bits": []
                            }
                        ]
                    },
                    {
                        "ref_optimizer_key_uses": []
                    },
                    {
                        "rows_estimation": [
                            {
                                "table": "`employees`",
                                "range_analysis": {
                                    "table_scan": {
                                        "rows": 100166,
                                        "cost": 10107
                                    },
                                    "potential_range_indexes": [
                                        {
                                            "index": "PRIMARY",
                                            "usable": false,
                                            "cause": "not_applicable"
                                        },
                                        {
                                            "index": "idx_name_age_position",
                                            "usable": true,
                                            "key_parts": [
                                                "name",
                                                "age",
                                                "position",
                                                "id"
                                            ]
                                        }
                                    ],
                                    "setup_range_conditions": [],
                                    "group_index_range": {
                                        "chosen": false,
                                        "cause": "not_group_by_or_distinct"
                                    },
                                    "skip_scan_range": {
                                        "potential_skip_scan_indexes": [
                                            {
                                                "index": "idx_name_age_position",
                                                "usable": false,
                                                "cause": "query_references_nonkey_column"
                                            }
                                        ]
                                    },
                                    "analyzing_range_alternatives": {
                                        "range_scan_alternatives": [
                                            {
                                                "index": "idx_name_age_position",
                                                "ranges": [
                                                    "a < name"
                                                ],
                                                "index_dives_for_eq_ranges": true,
                                                "rowid_ordered": false,
                                                "using_mrr": false,
                                                "index_only": false,
                                                "rows": 50083,
                                                "cost": 17529,
                                                "chosen": false,
                                                "cause": "cost"
                                            }
                                        ],
                                        "analyzing_roworder_intersect": {
                                            "usable": false,
                                            "cause": "too_few_roworder_scans"
                                        }
                                    }
                                }
                            }
                        ]
                    },
                    {
                        "considered_execution_plans": [
                            {
                                "plan_prefix": [],
                                "table": "`employees`",
                                "best_access_path": {
                                    "considered_access_paths": [
                                        {
                                            "rows_to_scan": 100166,
                                            "filtering_effect": [],
                                            "final_filtering_effect": 0.5,
                                            "access_type": "scan",
                                            "resulting_rows": 50083,
                                            "cost": 10105,
                                            "chosen": true
                                        }
                                    ]
                                },
                                "condition_filtering_pct": 100,
                                "rows_for_plan": 50083,
                                "cost_for_plan": 10105,
                                "chosen": true
                            }
                        ]
                    },
                    {
                        "attaching_conditions_to_tables": {
                            "original_condition": "(`employees`.`name` > 'a')",
                            "attached_conditions_computation": [
                                {
                                    "table": "`employees`",
                                    "rechecking_index_usage": {
                                        "recheck_reason": "low_limit",
                                        "limit": 200,
                                        "row_estimate": 50083
                                    }
                                }
                            ],
                            "attached_conditions_summary": [
                                {
                                    "table": "`employees`",
                                    "attached": "(`employees`.`name` > 'a')"
                                }
                            ]
                        }
                    },
                    {
                        "optimizing_distinct_group_by_order_by": {
                            "simplifying_order_by": {
                                "original_clause": "`employees`.`position`",
                                "items": [
                                    {
                                        "item": "`employees`.`position`"
                                    }
                                ],
                                "resulting_clause_is_simple": true,
                                "resulting_clause": "`employees`.`position`"
                            }
                        }
                    },
                    {
                        "reconsidering_access_paths_for_index_ordering": {
                            "clause": "ORDER BY",
                            "steps": [],
                            "index_order_summary": {
                                "table": "`employees`",
                                "index_provides_order": false,
                                "order_direction": "undefined",
                                "index": "unknown",
                                "plan_changed": false
                            }
                        }
                    },
                    {
                        "finalizing_table_conditions": [
                            {
                                "table": "`employees`",
                                "original_table_condition": "(`employees`.`name` > 'a')",
                                "final_table_condition   ": "(`employees`.`name` > 'a')"
                            }
                        ]
                    },
                    {
                        "refine_plan": [
                            {
                                "table": "`employees`"
                            }
                        ]
                    },
                    {
                        "considering_tmp_tables": [
                            {
                                "adding_sort_to_table": "employees"
                            }
                        ]
                    }
                ]
            }
        },
        {
            "join_execution": {
                "select#": 1,
                "steps": [
                    {
                        "sorting_table": "employees",
                        "filesort_information": [
                            {
                                "direction": "asc",
                                "expression": "`employees`.`position`"
                            }
                        ],
                        "filesort_priority_queue_optimization": {
                            "limit": 200,
                            "chosen": true
                        },
                        "filesort_execution": [],
                        "filesort_summary": {
                            "memory_available": 262144,
                            "key_size": 40,
                            "row_size": 186,
                            "max_rows_per_buffer": 201,
                            "num_rows_estimate": 100166,
                            "num_rows_found": 100000,
                            "num_initial_chunks_spilled_to_disk": 0,
                            "peak_memory_used": 38994,
                            "sort_algorithm": "std::stable_sort",
                            "unpacked_addon_fields": "using_priority_queue",
                            "sort_mode": "<fixed_sort_key, additional_fields>"
                        }
                    }
                ]
            }
        }
    ]
}
image.png image.png image.png ![image.png](https://img.haomeiwen.com/i14736547/edd30ef7462b6052.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/e98800097d3dee19.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/dfbda166378ef541.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/ef47a7e20105ecf6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/00c0e6ab78eb02b7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://img.haomeiwen.com/i14736547/f03e07475865462b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/65068c4ea4456307.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://img.haomeiwen.com/i14736547/d4cadc4c0a989231.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/81b4bcdf8d712baa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14736547/0553404eb1cd9a3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
image.png
image.png
image.png
image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读