Как оптимизировать MySQL-запросы и снизить нагрузку на сервер? - PullRequest
1 голос
/ 13 сентября 2011

Мои таблицы в БД выглядят так

Первый стол enter image description here

Второй стол - lastsrvc (Информация о последней услуге). Столбец идентификатора - уникальный идентификатор для каждой проблемы. столбец cid - идентификатор компании. Это столбец ссылок между двумя таблицами: main и lastsrvc.

enter image description here

Теперь, что я хочу сделать, скажем, подсчитать все проблемы для компании 1. Мой код отправляет запрос «пока 1» и выбирает все строки основной таблицы. Затем отправляет второй запрос в течение времени для каждой строки компании. Если в будущем появится 10 000 компаний, то я думаю, что сервер будет загружен. Есть ли способ отправить 1 запрос вместо отправки запроса для каждой компании (в течение времени)? Можно ли использовать COUNT раньше, чем второй запрос в то время как? Спасибо заранее.

Мой код выглядит так

    <?php
    $query=$db->query("SELECT * FROM main");
    while($row=$query->fetch_object())
    {?>
        <tr> 
        <td><?=$row->id;?></td>
        <td><?=$row->company;?></td>
        <td><?=$row->address;?></td>
        <td><?=$row->contact_name;?></td>
        <td><?=$row->contact_phone;?></td>
        <td><?php 
        if ($row->warr)
        {
            echo 'Var,'.$row->warr_year.' il';
        }
        else {
            echo 'Yoxdur';
            }
        ?></td>
        <td>
        <?php
        if ($query2=$db->query("SELECT * FROM lastsrvc WHERE cid='$row->id'"))
        echo $query2->num_rows;
        ?>
        </td>
        </tr>
<?php } ?>

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Используйте это как ваш (и единственный) запрос верхнего уровня:

SELECT main.id, company, address, contact_name, contact_phone, COUNT(cid) as cnt
FROM main
LEFT JOIN lastsrvc ON main.id = lastsrvc.cid
GROUP BY main.id

Один отдельный запрос с объединением почти всегда будет намного эффективнее, чем выполнение 1 + n запросов. Вы просто выводите это поле 'cnt' как обычно:

<td><?php echo $row->cnt ?></td>
2 голосов
/ 13 сентября 2011

присоединиться

SELECT main.etc, main.etc ..., COUNT(*) AS total
FROM main
LEFT JOIN lastsrvc ON main.id=lastsrvc.cid
GROUP BY main.id;

Когда данные становятся больше, используйте разбиение на страницы для фрагментации результата.
Поскольку больший возврат HTML, браузер также не может принять его
(Представьте, что страницу размером более 10 Мбайт трудно загрузить в браузере должным образом)


Вы также можете сохранить результаты в кеш, например в memcache.
Преимущество кэша заключается в том, чтобы избежать чрезмерного запроса к базе данных

0 голосов
/ 13 сентября 2011

В добавив к другим ответам, вы также можете установить индексы для столбцов, к которым вы присоединяетесь, и фильтрации для ускорения запросов в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...