Запрос страницы php занимает 15 минут, а тот же запрос на phpmyadmin занимает 3 секунды.

Запрос страницы php занимает 15 минут, а тот же запрос на phpmyadmin занимает 3 секунды, нет смысла ГИГАНСКАЯ РАЗНИЦА Я использую сервер в интрасети, файл php находится на том же сервере, что и mysql, и phpmyadmin также находится на этом же сервере . В задействованных таблицах меньше 20 тыс. Строк, но окончательный результат - всего 144 строки. Вот запрос:

SELECT a.cod_empresa, a.dat_alt_sit, a.cod_cliente, a.num_pedido, 
        b.qtd_pecas_solic, b.qtd_pecas_cancel, b.qtd_pecas_atend, b.cod_item, b.num_pedido, 
        c.nom_cliente, 
        d.qtd_liberada, d.qtd_reservada 
FROM lx_pedidos a, 
     lx_ped_itens b, 
     lx_clientes c, 
     lx_estoque d 
WHERE 
    a.num_pedido = b.num_pedido 
AND a.cod_empresa = b.cod_empresa 
AND c.cod_cliente = a.cod_cliente 
AND b.cod_item = d.cod_item 
AND b.cod_empresa = d.cod_empresa 
AND a.ies_sit_pedido = 'N' 
AND a.cod_nat_oper <> 9001 
AND d.qtd_liberada > 0 
AND (b.qtd_pecas_solic - b.qtd_pecas_cancel - b.qtd_pecas_atend) > 0 
AND (a.cod_empresa = 2 or a.cod_empresa = 3 or a.cod_empresa = 5) 
AND a.dat_alt_sit > '2018-07-01' 
AND a.dat_alt_sit < '2018-07-31'                                      
ORDER BY b.cod_item

php код:

    echo 'point 2 '.hojeDataHoraHuman();
    $result = mysqli_query($conn, "QUERY^^^");

    echo 'point 3 '.hojeDataHoraHuman();


    $cont1 = 0;
    $totGeral = 0;
    while($row = mysqli_fetch_assoc($result)){
        $cont1++;
(...)

СОЗДАТЬ ТАБЛИЦЫ

CREATE TABLE lx_pedidos ( 
    id                  int(11) AUTO_INCREMENT NOT NULL,
    cod_empresa         int(2) NULL,
    num_pedido          int(6) NULL,
    cod_cliente         bigint(15) NULL,
    pct_comissao        varchar(5) NULL,
    cod_nat_oper        int(4) NULL,
    cod_transpor        varchar(15) NULL,
    ies_finalidade      int(1) NULL,
    ies_frete           int(1) NULL,
    ies_preco           varchar(1) NULL,
    cod_cnd_pgto        int(3) NULL,
    ies_embal_padrao    int(1) NULL,
    ies_tip_entrega     int(1) NULL,
    ies_aceite          varchar(1) NULL,
    ies_sit_pedido      varchar(1) NULL,
    dat_pedido          date NULL,
    num_pedido_cli      varchar(25) NULL,
    num_list_preco      int(4) NULL,
    cod_repres          int(4) NULL,
    dat_alt_sit         date NULL,
    dat_cancel          date NULL,
    cod_motivo_can      varchar(4) NULL,
    dat_ult_fatur       date NULL,
    cod_moeda           int(1) NULL,
    ies_comissao        varchar(1) NULL,
    cod_tip_carteira    int(2) NULL,
    data_ult_sync       datetime NOT NULL,
    id_sync             int(11) NOT NULL,
    info                varchar(255) NOT NULL,
    PRIMARY KEY(id)
)

-

CREATE TABLE lx_clientes ( 
    id                  int(11) AUTO_INCREMENT NOT NULL,
    cod_cliente         varchar(15) NULL,
    cod_class           varchar(1) NULL,
    nom_cliente         varchar(36) NULL,
    dat_cadastro        varchar(10) NULL,
    end_cliente         varchar(36) NULL,
    den_bairro          varchar(23) NULL,
    cod_cidade          varchar(9) NULL,
    cod_cep             varchar(9) NULL,
    num_caixa_postal    varchar(15) NULL,
    num_telefone        varchar(15) NULL,
    num_suframa         varchar(9) NULL,
    cod_tip_cli         varchar(2) NULL,
    den_marca           varchar(15) NULL,
    nom_reduzido        varchar(29) NULL,
    den_frete_posto     varchar(19) NULL,
    num_cgc_cpf         varchar(19) NULL,
    ins_estadual        varchar(16) NULL,
    cod_portador        varchar(3) NULL,
    ies_tip_portador    varchar(15) NULL,
    cod_consig          varchar(15) NULL,
    ies_cli_forn        varchar(1) NULL,
    ies_zona_franca     varchar(1) NULL,
    ies_situacao        varchar(1) NULL,
    cod_rota            int(5) NULL,
    cod_praca           varchar(10) NULL,
    dat_atualiz         varchar(20) NULL,
    nom_contato         varchar(20) NULL,
    dat_fundacao        varchar(9) NULL,
    cod_local           int(1) NULL,
    PRIMARY KEY(id)
)

-

CREATE TABLE lx_estoque ( 
id              int(11) AUTO_INCREMENT NOT NULL,
cod_empresa     int(2) NULL,
cod_item        varchar(15) NULL,
qtd_liberada    int(9) NULL,
qtd_reservada   int(3) NULL,
dat_ult_entrada date NULL,
dat_ult_saida   date NULL,
PRIMARY KEY(id)
)

-

CREATE TABLE lx_ped_itens ( 
    id                  int(11) AUTO_INCREMENT NOT NULL,
    cod_empresa         int(2) NULL,
    num_pedido          int(6) NULL,
    num_sequencia       int(2) NULL,
    cod_item            varchar(30) NULL,
    pct_desc_adic       decimal(4,2) NULL,
    pre_unit            decimal(12,3) NULL,
    qtd_pecas_solic     int(4) NULL,
    qtd_pecas_atend     int(3) NULL,
    qtd_pecas_cancel    int(4) NULL,
    qtd_pecas_reserv    int(1) NULL,
    prz_entrega         date NULL,
    qtd_pecas_romaneio  int(1) NULL,
    pct_desc_bruto      int(2) NULL,
    data_ult_sync       datetime NOT NULL,
    id_sync             int(2) NOT NULL,
    info                varchar(255) NOT NULL,
    PRIMARY KEY(id)
)

результат в phpmyadmin: полученные результаты

Оператор mysqli: запрос кода php

Добавить: я сделал запрос сейчас с помощью join, и он всегда работает в phpmyadmin и на моей странице php, но этот запрос работает в базе данных informix, где у меня есть те же таблицы: присоединиться к запросу (почему ??)

Время 15 минут между точками 2 и 3. Пожалуйста, любое предложение полезно

1
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте несколько индексов в свою схему:

ALTER TABLE lx_pedidos ADD INDEX dat_alt_sit_idx (dat_alt_sit, cod_empresa, cod_nat_oper);
ALTER TABLE lx_pedidos ADD INDEX num_pedido_idx (num_pedido);
ALTER TABLE lx_pedidos ADD INDEX cod_cliente_idx (cod_cliente);
ALTER TABLE lx_clientes ADD INDEX cod_cliente_idx (cod_cliente);
ALTER TABLE lx_ped_itens ADD INDEX num_pedido_idx (num_pedido);
ALTER TABLE lx_ped_itens ADD INDEX cod_item_idx (cod_item, cod_empresa);
ALTER TABLE lx_estoque ADD INDEX cod_item_idx (cod_item, cod_empresa);

И измените свой запрос, чтобы использовать JOIN:

SELECT a.cod_empresa, a.dat_alt_sit, a.cod_cliente, a.num_pedido, 
        b.qtd_pecas_solic, b.qtd_pecas_cancel, b.qtd_pecas_atend, b.cod_item, b.num_pedido, 
        c.nom_cliente, 
        d.qtd_liberada, d.qtd_reservada 
FROM lx_pedidos a
JOIN lx_ped_itens b
ON a.num_pedido = b.num_pedido
    AND a.cod_empresa = b.cod_empresa
    AND (b.qtd_pecas_solic - b.qtd_pecas_cancel - b.qtd_pecas_atend) > 0
JOIN lx_clientes c
ON c.cod_cliente = a.cod_cliente
JOIN lx_estoque d
ON b.cod_item = d.cod_item 
    AND b.cod_empresa = d.cod_empresa
    AND d.qtd_liberada > 0
WHERE a.ies_sit_pedido = 'N' 
AND a.cod_nat_oper <> 9001 
AND (a.cod_empresa = 2 or a.cod_empresa = 3 or a.cod_empresa = 5) 
AND a.dat_alt_sit > '2018-07-01' 
AND a.dat_alt_sit < '2018-07-31'  

Внесены изменения в эту БД: Query took 0.2310 seconds.

ПРИМЕЧАНИЕ У вас большая проблема. В таблице lx_pedidos a есть столбец cod_cliente bigint(15) NULL,, но в таблице lx_clientes c есть столбец cod_cliente varchar(15) NULL,, поэтому JOIN lx_clientes c работает довольно медленно. Это будет намного быстрее, если вы переключите lx_clientes на использование того же типа bigint(15).

ALTER TABLE lx_clientes MODIFY COLUMN cod_cliente bigint(15);

Этот запрос не выполняется для вашего набора данных. Проверьте свою запись select * from lx_clientes where id = 9290. Имеет символ -. Когда вы меняете это значение - ALTER TABLE должен работать.

После этой модификации: Query took 0.0041 seconds ;-)

Мне это кажется невозможным для объема данных, который вы объявили менее 100 КБ. Пожалуйста, предоставьте 'SHOW CREATE TABLE ... для каждого стола! и покажи как быстро просто: SELECT a.cod_empresa, a.dat_alt_sit, a.cod_cliente, a.num_pedido FROM lx_pedidos a WHERE a.ies_sit_pedido = 'N' AND a.cod_nat_oper <> 9001 AND (a.cod_empresa = 2 or a.cod_empresa = 3 or a.cod_empresa = 5) AND a.dat_alt_sit > '2018-07-01' AND a.dat_alt_sit < '2018-07-31'

Alex 13.09.2018 22:49

последний работал: A mostrar registos de 0–24 (всего 625, A consulta demorou 0,0005 segundos.)

Ronaldo Bini Jr. 13.09.2018 22:51

теперь добавляем первый JOIN lx_ped_itens b ON a.num_pedido = b.num_pedido AND a.cod_empresa = b.cod_empresa AND (b.qtd_pecas_solic - b.qtd_pecas_cancel - b.qtd_pecas_atend) > 0 - и проверяем работоспособность

Alex 13.09.2018 22:54

добавить следующую часть с помощью JOIN next table :-)

Alex 13.09.2018 23:00

Я вернусь завтра, наверное ... нужно идти. Вы определенно можете добавить несколько индексов к своим таблицам. Но нужно немного разобраться. до сих пор кажется, что что-то не так только с вашим сервером mysql. так как он просто время от времени не отвечает :-)

Alex 13.09.2018 23:04

Я тоже вернусь завтра.

Ronaldo Bini Jr. 14.09.2018 00:51

спасибо за попытку помочь вот SQL drive.google.com/drive/folders/…

Ronaldo Bini Jr. 14.09.2018 13:20

@RonaldoBiniJr. проверьте обновленный ответ. Я тестировал свой местный Query took 0.2310 seconds.. На данный момент все в порядке.

Alex 14.09.2018 14:42

ЭТО СРАБОТАЛО!!! Я просто не понимал почему. Дело в cod_cliente нормально, но только после добавления индексов заработало. Как это было для тебя? До внесения этих изменений он оставался загружаться вечно?

Ronaldo Bini Jr. 14.09.2018 20:10

Да, это было медленно. Не навсегда, но, полагаю, на несколько минут меньше 10. но все зависит от производительности сервера. Прочтите об индексировании :-) Я не могу объяснить вам все, что я узнал за годы, всего за 5 минут :-). Просто помните, что всякий раз, когда ваш запрос становится медленнее, вам, вероятно, придется пересмотреть свои индексы.

Alex 14.09.2018 20:22

Вот с чего начать: stackoverflow.com/questions/3049283/…

Alex 14.09.2018 20:24

Ты мужчина !!! Моя база данных теперь очень быстрая! Каждый был изменен с этими индексами! Я, конечно, изучу это! И последнее, как я могу увидеть созданные индексы в phpmyadmin или через sql, возможно?

Ronaldo Bini Jr. 14.09.2018 20:27
SHOW CREATE TABLE ... это то, о чем я спросил вас в самом начале ;-)
Alex 14.09.2018 20:30

Другие вопросы по теме