php - 加速mysql查询

标签 php mysql join query-optimization

我在 MySQL 中有这个查询。该查询运行时间太长,我知道问题出在选择器 (coalesce ((SELECT ...) ,我不知道如何通过连接来加速查询。

我希望你们中的一些 SQL 专家能够帮助我。

SELECT
    COALESCE(
        (SELECT CONCAT(d.PRIJEVOZNIK, ' ', d.VOZAC_TRANSFER) 
         FROM dokum_zag as d
         where d.SIFKNJ='NP' and
               d.ID_VEZA=dokum_zag.ID and 
               d.korisnicko_ime=dokum_zag.korisnicko_ime 
         ),'') as PRIJEVOZNIK,
      (RELACIJA_TRANS_VOZ_TRANS) as RELACIJA_TRANS_VOZ, 
      (PRIJEVOZNIK_POVRATNI_TRANS) as PRIJEVOZNIK_POVRATNI, 
      (VAUC_KNJIZENO_TRANS) as VAUC_KNJIZENO, 
      ID_NALOGA, 
      ID_NALOGA_POV, 
      ID_VAUCHER, 
      DOLAZAK, VRIJ_TRANSFER,ODLAZAK,VRIJEME_LETA_POVRAT ,BRDOK, NOSITELJ_REZ, RELACIJA_TRANS, VOZILO_NAZIV, BROJ_NALOGA,BROJ_NAL_POV,BROJ_VAUCHER,BROJ_SOBE,VALIZN,PAX, MPIZN,ID 
FROM
    dokum_zag 
WHERE 
    korisnicko_ime = '10' and 
    ((DOLAZAK='2015-07-30') or (ODLAZAK='2015-07-30')) and 
    STORNO <> 'DA' and 
    SIFKNJ = 'TR' and 
   ((YEAR(DOLAZAK)= '2015') or (YEAR(ODLAZAK)= '2015')) 
order by 
   (CASE WHEN DOLAZAK < '2015-07-30' THEN ODLAZAK ELSE DOLAZAK END) , 
   (CASE WHEN DOLAZAK < '2015-07-30' THEN VRIJEME_LETA_POVRAT ELSE VRIJ_TRANSFER END), ID 

最佳答案

如果没有数据库结构以及对要提取的内容的描述,就很难为您提供帮助。

从逻辑的角度来看,有些东西是多余的,例如

((DOLAZAK='2015-07-30') or (ODLAZAK='2015-07-30')) and 
...
((YEAR(DOLAZAK)= '2015') or (YEAR(ODLAZAK)= '2015')) 

年份部分不是必需的,因为年份是在前两个部分指定的。

另一件可能让服务器发疯的事情是奇怪的 order by 子句,因为它会随着记录的不同而变化(测试此设置是否固定在字段上)。

您还可以检查外部 where 子句中的所有字段的索引是否正确设置,以及那些非数字、不是 varchar 的字段(例如 SIFKNJ) > 和 STORNO 应该是 char(2) )。

coalesce 部分可以通过outer join 来解决,因此不会对每一行进行计算。但这取决于您想要从数据库中提取什么以及如何提取...(因为该子查询在 where 部分有自己的字段...很奇怪)

希望这能有所帮助

关于php - 加速mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31741804/

相关文章:

php - 在 php 中使用时,MySQL 查询返回空结果

php var_dump() 不显示非英文字符

php - CakePHP 3.0 连接数据库失败

php - MySQL 就像在一行上一样,就像在多行 INNER JOINED 表上一样

mysql - 子查询或加入?

php - 如何使用 php session 访问数据库信息?

PHP 注册函数未正确插入到 phpmyadmin 表中

php - 错误 fetchAll(PDO::FETCH_ASSOC)

mysql - 何时在连接表上添加索引

python - (单行)连接列表列表的命令,其中内部列表由空格连接,外部列表由 '\n' 连接