8.mysql索引、优化、锁



一、mysql配置文件

    1.log-bin 记录表结构、数据修改调整的日志,主要用于主从复制的二进制日志文件;

    2.windows 下的配置文件为my.ini ,linux为:/etc/my.cnf文件;

    3.log-error 默认是关闭的,记录严重警告和错误信息,每次启动和关闭的详细信息等;

    4.log 查询日志 默认是关闭的,记录查询的sql语句;

    5.数据文件:frm文件为存放表结构文件,myd文件为存放表数据,myi文件为存放表索引

       6.show variables like '%%dir'; -- mysql查看文件路径

二、mysql逻辑架构:连接、服务、引擎、存储;

三、存储引擎

    1.show ENGINES 查看mysql的引擎。其中,较常用的是innodb,myisum引擎。innodb支持事务,且可以加索引,支持行锁;

        事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败;

        简单地说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败;

         事务的四大特性:

        1.原子性(Atomicity)

            事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。

        2.一致性(Consistency)

            事务发生前和发生后,数据的完整性必须保持一致。

        3.隔离性(Isolation)

            当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。

        4.持久性(Durability)

            一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过'补偿性事务'。

    2.show variables like '%storage_engine%' ,查看默认的存储引擎;

    3.myisam不支持主外键,不支持事务,表锁,只缓存索引,不缓存真实数据,表空间小,关注性能;innodb支持事务,支持主外键,行锁,适合高并发,不仅缓存索引也会缓存真实数据,表空间大,关注事务;

四、sql查询慢,等待时间长可能原因:查询语句写的不好;索引失效;关联查询join太多;服务器各个参数调优;

五、索引

    1.索引是帮mysql高效获取数据的数据结构,本质是一种数据结构,排好序的快速查找数据结构,会影响where和order by后面的条件;

    2.除了数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。

    3.我们平时所说的索引,一般指B树结构组织的索引;

    4.索引优势:类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本;通过索引列对数据进行排序,降低数据排序成本,降低了CPU消耗;

    5.实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的,提高查询,会降低更新表的速度;

    6.索引分类:

        单值索引:一个索引只包含一个字段,一个表可以有多个单值索引;

        复合索引:一个索引包含多个列;

        唯一索引:索引列的值必须唯一,但允许为空;

        7.需要建立索引的情况:

            7.1主键自动建立唯一索引

            7.2频繁作为查询条件的字段应创立索引

            7.3查询中与其他表关联的字段,外键关系建立索引

            7.4查询中排序的字段

            7.5查询中分组或者统计的字段

        8.不要建索引的情况:

            8.1表数据比较少

            8.2经常增删改的字段

            8.3数据重复且分布平均的字段

            8.4where条件用不到的字段不用建

六、性能分析

1.使用explain关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理sql语句,分析查询语句或者是表结构的性能瓶颈;

2.explain中的id:表示sql查询语句中,不同表的执行顺序,如果id相同,那么从上往下,依次执行;如果id不同,以id从大到小依次执行;

3.explain中的select_type:查询的类型,数据读取操作的操作类型:

    simple -- 简单的select查询,不含子查询,或者union;

    primary-- 最外层查询,也就是包含子查询最后加载的;

    subquary-- 在select 或 where包含了子查询;

    derived-- 在from列表中包含的子查询被标记为derived(衍生),mysql会递归执行这些子查询,把结果放在临时表里;

    union -- 若第二个select 出现在union之后,则被标记为union;若union包含在from子句查询中,外层select将被标记为derived;


    4.explain中的type:显示查询使用了何种类型,从最好到最差:

        system--const-eq_ref--ref--range--index--all

    5.explain中的possible_keys 和key:前者为在查询过程中可能用到的索引,后者为实际用到的索引;

        覆盖索引:select 查询的字段跟建立索引的字段一一对应;

    6.explain中的key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好;

    7.explain中的ref:显示索引的哪一列被使用,如果可能,是一个常数,那些列或常量被用于查找索引列上的值;

    8.explain中的rows:根据表统计信息及索引选用情况,大致估算出找到所需记录所需要读取的行数;

    9.explain中的extra:

        using filesort:对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql中无法利用索引完成的排序操作称为'文件排序';

        using temporary:使用了临时表保存中间结果,在对查询结果排序时使用临时表,常见order by 和group by ;

        using index 使用索引;


七、索引优化

    1.两表连接,左连接往右表上加索引

            小表驱动大表:数据量小的数据集驱动数据量大的数据集,例如使用left join,sql先执行左侧表,后执行右侧表,左侧表为驱动表(数据量少的),右侧为被驱动表(数据量多的);

            in跟exists区别:in里如果是查询,会先执行,exists不会,返回True或者False,用做条件判断;


    2.避免索引失效:

        2.1最佳左前缀法则:如果索引了多列,要遵守最左前缀法则,是指查询从索引的最左前列开始并且不跳过索引中的列。比如创建一个索引(cl1,cl2,cl3,cl4),在查询where 条件中,要有cl1,才能使用索引,否则索引失效;

        2.2不要在索引列上做任何操作(计算、函数、类型转换),否则会导致索引失效而转向全表扫描;

        2.3范围之后全失效。比如:where 在cl2增加in、between、大于、小于等,就会导致cl2后面的字段使用索引失效;

        2.4少用select * ,用覆盖索引;

        2.5mysql在使用不等于的时候无法使用索引会导致全表扫描(mysql8.0,没有失效);

        2.6 is null,is not null也无法使用索引;

        2.7like以通配符开头,mysql索引失效会变成全表扫描;

        2.8少用or,用他来链接会导致索引失效(没有失效);

        2.9字符串不加单引号索引失效;

            2.10order by适用最左前缀原则,如果多个字段,要么同升,要么同降,才能使用索引;

八、慢查询日志

    1.慢查询日志是值运行时间超过long_query_time值的sql,则会被记录到慢查询日志中,默认关闭,如非必要,不要开启;

-- 查看慢日志是否开启

show variables like '%slow_query_log%';

-- 0为关闭,1为开启

set global slow_query_log = 0

-- 查看阈值

show variables like '%long_query_time%';

-- 设置阈值,需要重新连接或者新开一个会话才能使用

set global long_query_time = 3

九、show profile

    1.是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于sql的调优的测量,默认关闭状态,并保存资金15次的运行结果;

-- 查看profile

show variables like '%profiling%';

-- 查看profiles执行情况

show profiles

-- 查看具体一条事务的执行明细

show profile cpu,block io for query 179


十、sql慢排除步骤

收到慢的提示-打开慢日志-重跑sql-explain分析-show profile分析-全局查询日志

十一、锁

1.表锁(偏读,偏myisam):

    1.1.读锁:共享锁,该连接和其他连接都可以读该表,但该连接不能改加锁的表,也不能查其他表(解锁后才可以),其他连接写该表,需要等解锁后自动执行;

    1.2.写锁:排他锁,该连接可以读、写该加锁的表,不能读其他不加锁的表;其他连接读该加锁的表,会阻塞(解锁后才展示)


-- 展示表是否有加锁

show open tables

-- 添加锁

lock table js_table read,leiji write

-- 解锁

unlock tables

-- 查看锁的性能

show status like 'table%'


2.行锁(偏写,innodb):




你可能感兴趣的:(8.mysql索引、优化、锁)