Mysql 高级学习记录 持续更新~~~

    mysql 修改字符集编码之后重启创建的数据库能够生效。
    
    mysql 修改字符集编码之后重启不能对修改字符集之前的数据库产生影响(该乱码还是得乱码)
    
    
    frm文件:数据库结构文件
    myd文件:存放的是表数据
    myi文件:存放的是数据索引
    
    
    mysql数据库的分层:
        第一层:连接层
        第二层:服务层,主要完成的是核心服务功能,如:SQL接口,并完成缓存的查询,SQL分析和优化及部分内置函数的执行。
        第三层:引擎层,存储引擎。存储引擎真正的负责了Mysql中数据的存储和提取,通过api和存储引擎进行通信。不同的引擎有不同的特点:常用的是InnoDB和MyIsam
        第四层:存储层,主要是将数据存储在运行与裸设备的文件系统之上,并完成与存储引擎的交互。
        
        
        sql性能下降、执行时间长的原因和处理方式?
          1.sql本身写的不好
          2.索引失效
          3.关联查询太多(join太多)
          4.mysql数据库的配置:如缓冲、线程数
          
    
    mysql机读的时候先读什么关键字?
        join关键字 :
            inner join :两个表的交集
            left join  : 左表的全部 + 右表的交集
            right join :两个表的交集 + 右表的全部
            
            left join + b.key is null : 左表的全部 - 和右表的交集
            full outer join : 全连接
            
            union : 将两者的sql结果去重合并
            
            
            -- inner join 交集
            SELECT * FROM t_user u INNER JOIN t_model m on u.`name` = m.userId;

            -- lefet JOIN 左连接:左边的全部数据 + 右边和左边交集key的数据
            SELECT * FROM t_user u LEFT JOIN t_model m on u.`name` = m.userId;

            -- RIGHT JOIN 又连接:右边的全部数据 + 左边和右边交集key的数据
            SELECT * FROM t_user u RIGHT JOIN t_model m ON u.`name` = m.userId;

            -- 左边的数据除去和右边有外键关联的数据
            SELECT * FROM t_user u LEFT JOIN  t_model m ON u.`name` = m.userId WHERE m.userId is NULL;

            -- 右边的数据除去和左边有外键关联的数据
            SELECT * FROM t_user u RIGHT JOIN t_model m on u.`name` = m.userId where u.id is NULL;
            
            -- 左边除掉右边关联数据 + 右边除去左边关联数据
            SELECT * from t_user u LEFT JOIN t_author a on u.id = a.id where a.id is NULL
            UNION
            SELECT * from t_user u RIGHT JOIN t_author a on u.id = a.id WHERE u.id is null
            
    mysql索引:帮助mysql高效获取数据的数据结构。提高查找效率,类比于字典。
         索引的本质:索引是数据结构。排好序的快速查找的数据结构。  where  order by
         建立了索引的数据库最好不要真正的删除索引。
         涉及到了大量数据的创建和删除之后可能会需要重建索引。
         
         
         索引的优点:
                1.提高了数据的检索效率,减少了数据库的IO成本。
                2.索引对数据进行排序,降低了排序成本,减少了cpu的消耗。
         索引的劣势:
                1.索引也会占用空间,大量索引会出现索引消耗资源太多。
                2.插入、删除、修改数据的时候还需要创建、修改、删除数据,增加数据库的压力。
                
         索引的分类:
                1.单一索引:一个索引只包含一个列,一个表可以有多个单一索引。一个表最多最好建立五个单一索引
                2.复合索引;一个索引包涵多个列,查找的还是遵循索引最左原则
                3.唯一索引:索引列的值必须唯一,但是允许为null
                
         什么时候创建索引?
                1.主键自动创建唯一索引
                2.频繁作为查询条件的字段应该创建索引
                3.查询中又外键关系的字段应该创建索引
                4.尽量创建复合索引
                5.where、order、group后面的数据需要创建索引
                
         什么时候不创建索引?
                1.表的数据少
                2.经常进行增删改查的字段
                3.字段只有几个值的字段比如:国籍、性别、boolean,这样创建索引对查询速度提升不大。
                
        mysql的性能分析?
                1.mysql有自己的最优处理分析器。
                2.CPU\IO
                3.EXPLAIN:分析报告
                        1.explain执行计划
                        2.id:决定了表的读取顺序(表的读取顺序并不是sql中的书写顺序)
                              值相同的时候从table由上到下执行
                              值不相同时由id最大的table执行到最小的table
                              值相同不同,先执行值最大的,然后顺序执行值小的两张表
                        3.select_type: 读取数据的操作类型
                               simple:简单的查询,不包含子查询和union
                               primary: 查询中包涵任何的子查询
                               subquery:在select或者where条件中包含了子查询
                               union:
                               union result:
                        4.type : 最好是要都能达到range(范围)、ref,需要避免all查询
                                system(只有一条数据) > const(唯一主键常量查询) > eq_ref(联合查询,第二张表只有一条记录) > ref > range > index > all
                                
                        5.key : 实际使用的索引,null表示没有命中索引,或者说该字段根本就没有索引
                        
                        6.possible-key : 理论上使用到的索引
                        
                        7.key_len : 索引key的长度。在查询结果一致的情况下key_len 越短越好
                        
                        8.rows : mysql优化器扫描的行数
                        
                        9.extra :额外信息
                                using filesort :order by后面不能命中索引,索引排序不对,mysql自动重新排序。(索引质量低下,比较危险需要重建索引)
                                using temporary:使用临时表保存中间结果并分组(非常不友好)
                                
                        
                             
            
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
                
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章