2024年mysql8、0学习

一、 索引结构

    1、 B-TREE: 每个节点包含指定数量的node和指针,插入数据的时候从上往下查找,直到找到正确的层存储位置,插入node后如果本节点node的数量超过指定的数量,那么中间的node上移,循环上移直到树稳定。

 2、 B+TREE: 

 3、 MySql中的B+TREE:数据只存储在叶节点上,上层的节点只起到定位功能,不存储数据

 二、索引分类

 

 二级索引查找数据流程:根据二级索引找到聚集索引值,然后回表查询找到真正的数据

 三、查看数据库性能和使用情况:

    1.  慢查询: 查看当前数据库sql语句操作数量 show global status like 'Com_______';

               查询慢查询日志(超过10秒): show variables like 'slow_query_log'  ; 查看慢查询日志是否开启

              开启慢查询日志:  修改 /etc/my.cnf     

                                           slow_query_log = 1  // 开启日志

                                           long_query_time = 2 // 设置慢查询日志为2秒

  2、 profiile详情: select @@have_profiling  // 查看是否支持profile

                               set  @@profiling = 1 // 开启profile

                               show PROFILES  // 显示每条sql语句的耗时时间

                              show PROFILE for query 63   // 查看指定query_id 各阶段耗时

                              show PROFILE cpu for query 63  // 查看指定query_id 的sql语句的cpu使用情况

  3、 explain执行计划:

 

 

 四、 索引使用原则:

        1、 最左前缀法则: 在使用联合索引的时候,查询从索引的最左测列开始,并且不跳过索引中间列。如果跳过某个中间列,索引将部分失效,即从跳过的字段开始后面的索引都失效。

        2、 范围查询: 在使用联合索引的时候,出现范围查询(> < ),范围查询右侧的列索引失效。解决办法,使用 >= 和 <= .

        3、 索引列运算: 不要在索引列上运算,否则列索引将失效。

        4、字符串列:索引建在字符串上的时候,查询时要使用引号包含起来,不要发生隐式类型转换,否则索引失效。

        5、 模糊查询: 如果只是尾部模糊匹配,索引仍然有效。如果是头部模糊匹配,索引失效。

        6、 or连接的条件: or两侧的条件字段必须都有索引,两个索引才有效,只要有一个条件没有索引,那另一个条件的索引也将失效。

        7、 数据分布影响:如果mysql评估使用索引比全表扫描还慢,则不使用索引。

        8、 SQL提示: 在sql语句中加入一些人为的提示,来替代mysql自动选择使用的索引,来达到优化操作的目的。

                                 use index:  建议使用哪个索引。 select * from c_cntr_siz_typ use index(udx_c_cntr_siz_typ) where cntr_siz_cod = '20' and cntr_typ_cod  = 'GP';

                                ignore index: 建议不使用哪个索引。

                                force index: 必须用哪个索引。

       9、 覆盖索引&回表查询:使用的二级索引中的字段,包含了select语句中的所有字段,就叫覆盖索引,这种情况下select中的数据能够从二级索引的叶子节点中直接读取。如果使用的二级索引没有包含selelct语句中的所有字段,那么还需要根据主键值从聚                                                集索引中。回表查询所需要的数据,这样就多了一次查询。

      10、 前缀索引: 只将长字符串的前面一部分建立索引。使用前缀索引都要进行回表查询,因为二级索引的叶子节点上只存储了这个列的部分数据,回表查询出这个字段的全部值后和条件中的值进行比较,如果匹配则返回数据,不匹配的丢弃。然后在二级索引中继续查找看是否有满足前缀索引的值,直到二级索引的叶节点链表中出现不满足前缀索引的,查询结束。

      11、 单列索引与联合索引: 推荐使用联合索引。

五、 索引设计原则:      

      1、 针对于数据量较大(10万行),且查询比较频繁的表建立索引。

      2、 针对于常作为查询条件(where)、排序(orderby)、分组(group by)操作的字段建立索引。

      3、 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
      4、 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
      5、 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率

      6、 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
      7、 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

六、 其他SQL语句优化:

    1、 插入数据优化:批量插入一次控制在1000条以内。手动控制事务。主键顺序插入。

          load指令加载超大量数据。

                                                 mysql --local-infile -u root -p  // shiyong --local-inlfile登录

                                                set global local-infile = 1  // 开启load指令加载数据

                                               load data local infile d:\data.sql  into table table_name fields terminated by ',' lines terminated by '\n';    //load   data.sql文件的数据进数据库, 字段已  ','分割,行已'\n'分割。

  2、 主键优化: 

            主键设计原则: 尽量降低主键长度,插入数据数据时尽量顺序插入,主键尽量是auto_increment自增主键。不要修改主键

 

 

 

 3、 order by 优化:

 

 4、 group by 优化:同 order by

5、 limit 优化: 

 6、 count优化:使用count(*) ,性能最佳

 7、 update 优化:update的时候要根据索引字段进行更新,否则就会锁表。

 七、 视图: with cascaded check option 开启视图在增、删、改的时候进行条件检查

 

         1、 视图更新: 

 八、 存储过程: 

       1、 变量:   @@系统变量    @自定义变量

                            select @@global.local_infile    // 查看系统变量

 

 

 

 2、 loop循环:

 3、 游标(cursor): 

         

 3、 条件处理程序:

 4、 函数:

九、 锁

       1、全局锁: 导数据库时使用: 

                            flush tables with read lock; // 加锁

                            mysqldump   -h主机  -uroot   -p密码 数据库名 > sql.dmp  // 备份数据库     mysqldump  --single-transaction -h主机  -uroot   -p密码 数据库名 > sql.dmp  // 不加锁备份

                            unlock tables;  //解锁

      2、表级锁:

                表锁:

                      表共享读锁: read lock      // 加读锁后,所有客户端只能读不能写

                      表独占写锁: write lock   // 加写锁后,加锁的客户端可读可写,其他客户端既不能读也不能写

                      语法: lock tables 表名... read/write  ;    // 加锁

                                 unlock tables    //   解锁

               元数据锁(meta data lock) MDL: 表结构锁,表有事务活动的时候,表结构不能修改。

 

                 意向锁: 用于在加表锁的时候,方便对行锁进行判断,来快速决定表锁能不能锁定。

3、 行级锁:

 

行锁:  

 

 

 

 十、 innodb引擎:

          1、 逻辑存储结构:

 2、 架构:

 

    内存结构: 

                  buffer pool:

           change buffer: 

          adaptive hash index:

         log buffer:

磁盘结构:

 

 

 后台线程:

 3、事务原理:

 

 

 

 4、 MVCC: 多版本并发控制

 

 

 

 

 

 

 

 

 

 

 十一、 MySql管理

 

 

 

 十二、 日志

          1、 错误日志

                show variables like "%log_error%"

          2、 二进制日志

 

 

 

           3、 查询日志

           4、 慢查询日志

 

 十二、 主从复制:将主数据库的二进制日志文件传到从数据库上执行,实现主从同步。

      

 

 

 

 

 

 

 十三、 分库分表

 

 

 

 十四、 MyCat

     1、 介绍

 十五、 读写分离:

 

posted @ 2024-03-10 23:11  supermanqd  阅读(57)  评论(0)    收藏  举报