字符串作为函数参数mysql数据库多表关联查询的慢SQL优化
  ⼯作中我们经常⽤到多个left join去关联其他表查询结果,但是随着数据量的增加,⼀个表的数据达到百万级别后,这种普通的left join 查询将⾮常的耗时。
举个例⼦:
    现在porder表有 1000W数据,其他关联的表数据都很少,因为条件的限制必须要关联3个表,正常的逻辑就是这样写,但是我们在数据库执⾏的时候会发现这样的SQL ⾮常耗时,input赋值语句返回值是什么类型
  ⽽且此时才 limit 800  这样的SQL怎么能让⽤户受得了呢?
select p.*,b.  from porder p
left JOIN brand b on p.supplier = b.supplier_id and b.mark = 0
left JOIN purchase c = c.id and c.mark = 0
left JOIN type t on c.category = t.type_id and t.mark = 0
WHERE p.nark = 0 ORDER BY p.id desc limit 800,500;
  通过查询SQL优化⽅⾯的知识,发现⼀种⽐较好的优化⽅案:
select p.*,b. from
(select po.id from porder po where po.mark = 0 order by po.id desc limit 800000,500) a
inner join porder p on a.id = p.id and p.mark = 0
linux安装php详细过程left JOIN brand b on p.supplier = b.supplier_id and b.mark = 0
left JOIN purchase c = c.id and c.mark = 0
left JOIN type t on c.category = t.type_id and t.mark = 0;
  我们可以先将数据量最⼤表的满⾜条件的ID查询出来,创建临时表,再⽤这个临时表去关联这个表本⾝以及其他表。limit80W 也就1S 时间。
SQL分析:
  我们可以使⽤ explain 查看上⾯2种SQL的执⾏计划。第⼀种SQL的执⾏计划中通过 row 和extra 都可以看出⾮常差,row⼏乎为全部扫描。
unsigned用什么格式符  优化后的SQL通过 row 和extra 都可以看出都是很好的状态,row的数据是第⼀种的 1%。相当于提升了 100倍。
subtotal函数自动填充序号  执⾏计划中的id列的数值越⼤,执⾏权就越⾼。id列的值相等的,就从上之下依次执⾏。明⽩了这⼀点,我们就可以再分析SQL了。
  数据库先执⾏了 select po.id from porder po where po.mark = 0 order by po.id desc limit 800000,500 这段SQL,将查询出的有效id(满⾜条件的id)放在了临时表a中,
  然后表a 再与其他的表匹配查询。
  (注:优先执⾏的SQL 不参与后⾯的表匹配。这⾥要理解,不然单独看执⾏计划,你会纳闷为何row列上 a表中数值⼩,⽽ id列为2的表(po) row列的数值也很⼤。
  你也可以拆分SQL。优先执⾏的SQL 单独拿出来执⾏,将查询到的结果当作查询条件,传给普通的 left join 中的where条件⾥⾯即
in(), in的⾥⾯不要写SQL查询,必须是明确的数值!)
我只是提供⽅法,具体的原理,⼤家可以上⽹查⼀查。数据库有⼀种叫驱动表的概念,⼤家可以了解下。或许对于理解这种⽅法更⽅便!
  注:这个优化后的SQL在执⾏ limit1000000,**  的时候效率也就下降了,⼤概4S钟以上。所以这个SQL也是有极限的,对于分页查询等等,如果数据量超过100W 要注意!
希望有⼤神,能在SQL上能有更⾼的突破,有⽅法的,希望⼤家⼀起分享,⼀起学习。谢谢~
mysql语句多表查询  补:为了应对超过百万级别的查询,或者导出,SQL优化暂时没有好的办法,但是我们可以在传参上做⽂章。
⽐如分页查询时,每页展⽰20条数据,⾸页查询时,我们可以得到⾸页最后⼀条数据的ID (起名:lastId)(按ID排序,降序),当点击第2页时,我们可以将 lastId 作为参数传⼊分页查询的SQL中。
这样分页时就加上了⼀个条件就是 ID<lastId(按ID排序,降序),limit也可以优化成  limit 20,这样优化后,因为limit 不再是 limit xxx,20,这样数据库在扫描满⾜条件的数据时,就会从此ID往后扫描,
且扫描到满⾜条件的20条后,就不会再多扫描,⼤⼤减少了扫描的数据量,⾃然也就提升了效率。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。