掌门 MySQL 数据库规约落地及优化实战

Posted 掌门技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了掌门 MySQL 数据库规约落地及优化实战相关的知识,希望对你有一定的参考价值。

     按照 mysql 的 B+ 树设计,一个数据页中至少要存放两行数据,否则 B+ 树会从树状结构退化为线性结构。
     因此当行存储的实际数据过大,在页中存放不下时,MySQL 在存储这行记录的时候,会将较大的数据列的数据存放在外部存储页中,数据页只保存指向外部存储页的指针。此时如果存储读取这个大的数据列,会额外消耗更多的 IO


 1.索引最大长度为 767 字节,若索引长度超过 767 字节将无法创建(可考虑创建前缀索引)
 2.索引长度与字段定义长度基本相同,前缀索引长度与定义的前缀长度有关
 3.变长类型如 varchar,额外需要 2 个字节存放索引长度
 4.如果字段可以为空,额外需要 1 个字节存放为空标识
 1mysql> 2+3| id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra                 |
4+5|  1 | SIMPLE      | t1    | range | uni_name      | uni_name | 43      | NULL |    1 | Using index condition |
6+71 row in 8mysql> 9| Table |  B+ 树的非叶子节点不会存放数据,只存放键值,一个页可以存放更多索引,索引树较矮


 B+ 树的查找必须到叶子节点才会命中,查找十分稳定

 B+ 树的叶子节点中存放有双向指针构成一种链表结构,范围查询效率非常高效。而数据库的范围查询十分常见


          普通索引列 name 为 varchar(20) 类型非空 (utf8mb4)
          普通索引列 info 为 varchar(150) 类型可以为空 (utf8mb4)
          1index_merge之using union:
2mysql> 34567+8| id | select_type | table   | type        | possible_keys                                                                          | key                               | key_len | ref  | rows | Extra                                                       |
9+12    3        store used columns from t1, t2 4        5           6               7                  8               
9             
       不管是 NLJ 或者是优化后的 BNL 算法,都是从驱动表中筛选数据,与被驱动表进行匹配,有以下特性:
  1. 1mysql> 2345  6+7| id | select_type | table    | type | possible_keys              | key  | key_len | ref  | rows     | Extra       |
    8+9|  1 | SIMPLE      | students | ALL  | created_at,idx_ref_user_id | NULL | NULL    | NULL | 52833786 | Using where |
    1mysql> 234(567891mysql> 2345(678  9    1mysql> 23456  7    8    9    1mysql> 23456+7| id | select_type        | table | type            | possible_keys  | key            | key_len | ref  | rows   | Extra                    |
    8+9|  1 | PRIMARY            | u     | range           | idx_uptime     | idx_uptime     | 6       | NULL | 103664 | Using where; Using index |
    1mysql> 234567+8| id | select_type | table | type   | possible_keys  | key            | key_len | ref          | rows   | Extra                                |
    9+1mysql> 2    -> 345+6| id | select_type | table | type | possible_keys       | key  | key_len | ref  | rows     | Extra       |
    7+8|  1 | SIMPLE      | users | ALL  | users_mobile_unique | NULL | NULL    | NULL | 83319185 | Using where |
    9+1mysql> 2    -> 345+6| id | select_type | table | type  | possible_keys       | key                 | key_len | ref   | rows | Extra |
    7+8|  1 | SIMPLE      | users | const | users_mobile_unique | users_mobile_unique | 62      | const |    1 | NULL  |
    9+1mysql> 23456 7+8| id | select_type | table           | type  | possible_keys                | key        | key_len | ref               | rows     | Extra                              |
    9+date 函数,导致无法通过 created_at 列匹配满足时间要求的数据,通过 1mysql> 23456  7 8+9| id | select_type | table           | type  | possible_keys                | key        | key_len | ref               | rows   | Extra                              |
    1mysql> 23456 7 8 9+1mysql> 23456 7 89+1mysql> 23456 7 89将内部查询使用括号包裹,强制其作为一个先导执行的子查询,然后对子查询的最终结果集进行排序返回。由于子查询中会存放所有满足条件的结果,并且进行文件排序,如果满足条件的结果非常大,该方法会消耗较多资源效率较低。(亦可)


    1mysql> 23456 7 891mysql> 234(5678 9 1mysql> 2    34    5    6    7    8    9    1mysql> 2    34    5    6    7    8    9    1mysql> 23    ss.id,
    4    ss.user_id userId,
    5    ss.scan_state scanCode,
    6    ss.bu,
    7    ss.source 
    89    t_screenshot ss
    1mysql> 23    ss.id,
    4    ss.user_id userId,
    5    ss.scan_state scanCode,
    6    ss.bu,
    7    ss.source 
    89    t_screenshot ss
    1mysql> 23  ss.student_id 4  ss.pre_seller_id 5  ss.state 67  students_seller ss 89  ss.bu = 1如:上一次循环取到的students_seller表的最大id为102378346
    2mysql> 3    -> 4  ss.student_id 5  ss.pre_seller_id 6  ss.state 78  students_seller ss 9前端/ / 、大数据工程师、算法工程师( /用户画像/推荐 )、K8s 架构师、运维工程师、产品经理、安全工程师、网络工程师。欢迎加入掌门教育大家庭,一起畅谈技术,分享交流。
    投递信箱:zeying.shi@zhangmen.com 施老师。

    往期好文

    INFRA-JOY微服务治理验证工程实践分享

    掌门持续交付流水线大规模实践

    绘本阅读总结


    mysql数据库优化实战--日期及IP地址的正确存储方式

    以上是关于掌门 MySQL 数据库规约落地及优化实战的主要内容,如果未能解决你的问题,请参考以下文章

    阿里巴巴 Sentinel 落地实践--掌门1对1微服务体系 Solar

    掌门1对1微服务体系Solar第2弹:阿里巴巴Sentinel落地实践

    MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!

    MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!

    MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!

    专注少儿成长,掌门少儿打造多维思维启蒙体验

    (c)2006-2024 SYSTEM All Rights Reserved IT常识