高性能mysql(二)schema设计以及sql执行、优化

1.索引覆盖:因为使用B+TREE存储索引数据(索引也是数据库的数据),因为叶子节点上存储着数据,其他索引也是通过主键去查找数据,如果可以直接把索引的数据读出使用而不用再次进入数据库表中进行查询操作,可以极大地提高效率(当然被查询的数据也必须在索引这个数据结构中)。注:索引数据是索引的索引集合(包括主键以及其他普通索引)。

2.explain:

         using index:表示数据不需要回表查询,查询所需的数据都是从索引文件(数据)中获取,

         using where:需要回表进行数据查询

3.优化注意点:

         3.1 : EXPLAIN SELECT COUNT(*) FROM t2_cdn_log 
where type=1 and object_Id in (51,52,54,59,61,69,70,71,97,98,103,104,105,106) 
and UNIX_TIMESTAMP('2018-12-05 00:00:00')<=UNIX_TIMESTAMP(log_time) 
and UNIX_TIMESTAMP(log_time)<=UNIX_TIMESTAMP('2018-12-05 23:59:59') #group by time;

         3.2 : EXPLAIN select sum(response_size),(UNIX_TIMESTAMP(log_time)-UNIX_TIMESTAMP('2018-12-05 00:00:00')) div 300 as time 
from t2_cdn_log where '2018-12-05 00:00:00'<=log_time
and log_time<='2018-12-05 23:59:59'
and type=1 and object_Id in (51,52,54,59,61,69,70,71,97,98,103,104,105,106) group by time

    两条语句都显示走了索引,但是第一条显示rows为七百多万,但是第二条只有14条:原因就是使用了 UNIX_TIMESTAMP()时间转换函数而导致索引失效,尽管显示其使用了index但是因为这种原因而导致索引无效

4.查询执行的基础:

5.union 查询:

   对于union查询,mysql现将一系列的单个查询结果放到一个临时表中,然后再重新读出临时表数据来完成union查询,在mysql中,每个查询都是一次关联,所以读取结果临时表也是一次关联。

6.mysql 执行关联查询:

   当前mysql关联执行的策略很简单,对任何关联都执行嵌套循环关联操作,即mysql先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。mysql会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关联表无法找到更多的行以后,mysql返回到上一层次关联表,看是否能够找到更多的匹配记录

       join关联:

       left join :

关联查询:

猜你喜欢

转载自blog.csdn.net/qq_35152911/article/details/84817536