DomenForum.net

DomenForum.net (https://domenforum.net/index.php)
-   Программирование (https://domenforum.net/forumdisplay.php?f=26)
-   -   MySQl: существует ли запись с параметрами (https://domenforum.net/showthread.php?t=206082)

Port_Artur 22.10.2016 19:28

MySQl: существует ли запись с параметрами
 
Если нужно проверить существует ли запись в баз данных с определёнными параметрами делаю так:

PHP код:

$sql mysql_query("SELECT * FROM tower WHERE number='$number' and title='$title' ") or error(mysql_error() );
$sqlc=mysql_num_rows($sql);


if (
$sqlc>0) { echo "В базе есть такая запись";} 

Но во время открытия страницы таких проверок нужно сделать порядка 500, что как я думаю сильно влияет на время открытия страницы (до 15 секунд).


Решил, что следует заменить 500 обращений к базе данных, на 500 обращений к массиву данных 1 раз выбранных из базы. Это должно значительно сократить время, как я думаю.

Выбираем все данные:

PHP код:

$sql mysql_query("SELECT * FROM tower"); 

А как дальше проверить, что в массиве есть запись с $number и $title?
Но в базе есть соответствующие поля, а с массивами как?
Помогите пожалуйста?

alex8 23.10.2016 13:19

$sql = mysql_query("SELECT * FROM tower");

$res = $conn->query($sql); //выполняем запрос

$a = array(); //пустой массив для хранения данных из таблицы
$b = array(); //пустой массив для хранения данных из таблицы

for ($i = 0; $i <= mysqli_num_rows($res); $i++) { //работаем со всемя записями из запроса

$row = $res->fetch_assoc(); //данные из записи представляем в виде массива $row

$a[$i] = $row["number"]; //сохраняем numbers в массиве
$b[$i] = $row["title"]; //сохранем titles в массиве

}

$res->free(); //освобождаем память

for ($i = 0; $i <= count($a); $i++) { //работаем со всеми данными из массива

if (($a[$i] == $number) and ($b[$i] == $title)) { //ищем в массивах нужные совпадения

//совершаем нужное действие

}

}

Port_Artur 23.10.2016 14:39

Спасибо. Я честно говоря думал 2-3 строки будет, - ну там какие-то специальные функции PHP с многомерными массивами.
Сомневаюсь, что будет быстрее чем:

PHP код:

$sql mysql_query("SELECT * FROM tower WHERE number='$number' and title='$title' ") or error(mysql_error() );
$sqlc=mysql_num_rows($sql);


if (
$sqlc>0) { echo "В базе есть такая запись";} 

Но всё равно, большое спасибо. Понял куда двигаться.

добавлено через 10 минут
Загнать в многомерный массив можно так:

PHP код:

$result mysql_query("SELECT * FROM tower"); 
$arr = array();
while ( 
$row mysql_fetch_array($result) ) {$arr[] = $row;} 


А вот как проверить переменные?
Если в базе number - 3-й столбец (начиная с 1), а title 7-й столбец.

alex8 23.10.2016 14:50

Я просто привел пример для работы с массивами.

Если таблица достаточно большая (сотни тысяч записей), то запросы к таблице работают гораздо быстрее, чем перебор массивов.

добавлено через 9 минут
$query = "SELECT * FROM tower";
$result = $mysqli->query($query);

/* numeric array */
$row = $result->fetch_array(MYSQLI_NUM);
printf ("%s (%s)\n", $row[2], $row[6]); //3 и 7 столбец соответственно

/* free result set */
$result->free();

Port_Artur 23.10.2016 15:00

До 10 тысяч записей и размер базы 2-3 мегабайта.

alex8 23.10.2016 15:09

Цитата:

Сообщение от Port_Artur (Сообщение 1389896)
До 10 тысяч записей

чтобы запросы работали быстрее, добавьте к столбцам number и title индексы (это можно сделать очень легко в phpmyadmin)

UFO 23.10.2016 20:00

Цитата:

Сообщение от alex8 (Сообщение 1389894)
Если таблица достаточно большая (сотни тысяч записей), то запросы к таблице работают гораздо быстрее, чем перебор массивов.

Абсолютно согласен. К тому же массивы - это текстовая часть PHP, т.е. тем самым Вы грузите сам PHP данными, а базы для того и придумали, чтобы нагрузку разделять. Конечно, 500 запросов - это немало, выполните свой запрос в PHPMyAdmin и увидите время выполнения, в принципе некоторые сайты работают с таким количество запросов на главной, это конечно не идеал, но существует.
Если сомневаетесь в скорости, то разделите запросы. Зачем Вам 500 запросов? Насколько регулярно это необходимо? Где оно будет запускаться?
Еще вариант - сделайте кэш, т.е. некий скрипт в ненагруженное время на сервере делает выборку из БД, и работает с основной массой, в течение дня в выборку попадают новые данные, ночью, к примеру, кэш снова обновляется.

miketomlin 01.11.2016 18:02

Port_Artur, подробнее изложите суть проблемы.

Если нужно узнать только наличие записей, подпадающих под заданный фильтр, используйте COUNT(). Тянуть из БД фактические данные, тем более по маске * не нужно ;)

Port_Artur 01.11.2016 18:39

Есть XML-файл с 500-ми значениями, нужно добавить в базу несуществующие, т.е. проверить каждое на вхождение в базу.
Не берём во внимание работу с XML.
Останавливаемся на цикле проверки. Нужно как можно быстрее по времени обработки, проверить по 2-м параметрам.

miketomlin 01.11.2016 19:03

Определите на этих двух параметрах составной первичный ключ или юник и попробуйте просто добавлять записи при помощи INSERT IGNORE порциями.


Текущее время: 18:55. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Техническая поддержка — DevArt.PRO. Перевод: zCarot.