mysql 优化【1】

报表需求1:从六千多万条数据中找需要的top100

方法:1.mysql explain 2.索引

由于数据量大,因此我们需要通过索引的方式降低搜索时间,不加索引FineReport直接报了sql时间过长的错误。

因此在对应的月份、用户等字段加了联合索引(保证这些选取的字段不为空,联合索引有最左匹配的说法,空了就全表搜了)

加完索引时间从没法搜降到了五秒左右。

报表需求2:从六千多万条数据*n月中找sum、avg等最大的top100

 sum、avg通过索引也可以降低执行时间。个人想法是通过地区表通过exist的方式计算哪些可选项,但是。。。可能还是比较麻烦,那就算了

同事:几千万条,从sql入手还是太慢了,想别的办法

待续。。。

 报表需求三:几个筛选项不要筛出空的结果

通常方法:distinct,其原理为sort+逐行迭代排序,所以输出有序,但会全文件排序。由于数据量过大,慢的一批

解决方法:1.group by,依然慢的一批。

  2.索引+exists (select prov_name from dim_area where prov_name='xxx')极快,因此通过附加的地区表与子查询查到哪些地区有数据,把这些作为结果。

总结:不要用会导致全表查的操作,建议通过select+索引的奇怪操作来做(走索引 走索引 走索引!)。

mysql explain

 https://www.cnblogs.com/tufujie/p/9413852.html

explain出来的信息有10列,分别是id、select_type、table、type(对表访问类型)、possible_keys(可能使用的索引)、key(实际索引)、key_len、ref、rows(扫描出的行数,估算的行数)、Extra

mysql 联合索引

多个字段同时建立的索引(有顺序,ABC,ACB是完全不同的两种联合索引)(abc就是建a/ab/abc三个索引)

1.最左匹配

  如abc,先匹配a,再bc,如果直接bc会不使用索引

2.最常用、筛选数据最多的字段放前边

mysql 索引btree hash

 hash索引一次就能定位,btree需要从根节点到叶子节点,最后才到具体页

所以hash快,但是其缺点是:1.不支持范围查询(between),只支持(=、in、<=>)

  2.btree可排序,hash不可以

  3.hash组合索引,通过所有的加一块,才算hash,所以只拿前几个进行搜索,不走索引

  4.当遇见大量Hash值相等的情况,hash不一定比btree快

mysql 索引 <=>、in、not in

 小数据量不走索引,大的走,所以还是通过explain看比较好

原文地址:https://www.cnblogs.com/tillnight1996/p/12787877.html