美文网首页
2021-01-16 - mysql优化

2021-01-16 - mysql优化

作者: 赤道的飞雪_f6e1 | 来源:发表于2021-01-16 17:40 被阅读0次

    分页优化

    表结构如下

    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

    相关文章

      网友评论

          本文标题:2021-01-16 - mysql优化

          本文链接:https://www.haomeiwen.com/subject/qvinaktx.html