sql优化问题


1.优化什么

  优化查询速度 避免全表扫描、避免索引不命中、避免文件排序、磁盘排序、未完待续。

2.什么是索引

  是一种帮助数据库快速查询的数据结构。

3.为什么选择b+ tree

  提高查询速度,减少磁盘io

3.1 各个数据结构的特点

  链表:查询次数O(n) 

  HASH桶 查询速度很快,但是对于 范围查询、不等于等不能查询 、hash冲突

  二叉树:可能成为链表。树的高度比较高、查询次数比较多

  b树:相对降低了io次数,但是因为数据存在各个节点中,减少了数据页承载数据的量,所以不如b+树

  b+树:非叶子节点存在冗余、叶子节点存在双向指针、每个数据也可容纳更多的数据、高度为三的b+树可达到4千万级数据

3.2主键

   1.建议设置成整型的自增主键

   2.整型 相对比其他数据类型所占字节少、自增避免数据库做树优化浪费性能、不增加主键数据库innodb会自动生成

4.sql 执行的过程

  客户端---连接器--缓存---分析器--有优化器--执行器---执行引擎

4.1.客户端:navicat 等

4.2.连接器:经过tcp的三次握手连接后,先校验账号密码,在把权限缓存,后续的操作权限都是这个缓存中获取,所以即使管理员更改了权限也要等再次连接的时候生效。

  查看连接的进程:show processlist;   kill id  杀掉进程;  

  默认休眠时间:8小时

   show global variables like 'wait_timeout';

       set global wait_timeout=28801

  

4.3缓存:

   查看缓存是否开启 show global variables like "%query_cache_type%"; 0 off 1:on 2 :demand (查询字段前面增加 SQL_CACHE)  demand 比较灵活

  查看缓存命中的情况:show status like "%Qcache%";

              

  Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。

  Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。

  Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。

  Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。

  Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。

  Qcache_not_cached:表示因为query_cache_type的设置而没有被缓存的查询数量。

  Qcache_queries_in_cache:当前缓存中缓存的查询数量。

  Qcache_total_blocks:当前缓存的block数量。

4.4分析器:

  词法分析器 ---语法分析器---语义分析器---构造语法树-生成执行计划  sql语句写错了就在此步骤发现 sql error

4.5 优化器:

  优化执行所选用的索引、语句的调整、等

4.6执行器:调用引擎接口执行sql

4.7用到的sql

  连接数据库:mysql -uroot -p 

  创建用户: create user 'xxx'@'%' identified by '123456';

  赋予权限: grant all privileges on *.* to 'xxx'@"%";

  刷新数据库:flush privileges;

  查看用户全新:show grants for 'xxx'@'%';

  更改密码:alter user 'xxx'@'%' identified with mysql_native_password by '654321';

  更改用户权限:update user set host='localhost' where user='xxx';

  查看表结构: describe user;

  创建索引:alter tablename add index indexname(colum);

  清空表:

  

 

4.4logbin

5优化sql 的工具

5.1 工具介绍

5.2 explain

5.3 show warning

5.4 开启看sql的 评估过程

6sql 查询的三个途径

7.影响sql选择查询途径的原因

7.1扫描行数

举例:

7.2回表次数

举例:

7.3是否可用索引:是否有序

7.4 覆盖索引

8.优化实例

8.1order by 

8.2 group by 

8.3 覆盖索引

8.4 索引下推

8.5 最左原则

9索引创建原则

9.1

9.2

9.3

9.4

9.5