Для вступления в общество новичков и профессионалов домен-индустрии, пожалуйста нажмите здесь ...

   
 Купля-продажа и обсуждение доменных имён
        

  
Вернуться   Форум о доменах > Дизайн и развитие проектов > Программирование
Регистрация Реноме Правила форума Справка Пользователи Социальные группы Все разделы прочитаны
Программирование PHP, Perl, HTML, XHTML, CSS, JavaScript, MySQL и другие языки кодирования.

Ответ
 
Опции темы
Сегодня
от 149р за .RU
Аренда сервера
2x Intel Hexa-Core Xeon E5-2420
Всего 79 евро!

с видеокартой GeForce GTX 1080 Ti
всего 99 евро!

от 149р за .РФ Реклама на DomenForum.net
Старый 22.10.2016, 19:28   #1
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
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?
Но в базе есть соответствующие поля, а с массивами как?
Помогите пожалуйста?
Port_Artur вне форума   Ответить с цитированием
Старый 23.10.2016, 13:19   #2
 
Регистрация: 22.06.2016
Сообщений: 618
Доменные сделки: 12
Реноме: 495
Одобрения
Спасибо (Отдано): 48
Спасибо (Получено): 144
$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)) { //ищем в массивах нужные совпадения

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

}

}
alex8 вне форума   Ответить с цитированием
Старый 23.10.2016, 14:39   #3
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
Спасибо. Я честно говоря думал 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-й столбец.

Последний раз редактировалось Port_Artur; 23.10.2016 в 14:50. Причина: Добавлено сообщение
Port_Artur вне форума   Ответить с цитированием
Старый 23.10.2016, 14:50   #4
 
Регистрация: 22.06.2016
Сообщений: 618
Доменные сделки: 12
Реноме: 495
Одобрения
Спасибо (Отдано): 48
Спасибо (Получено): 144
Я просто привел пример для работы с массивами.

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

добавлено через 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();

Последний раз редактировалось alex8; 23.10.2016 в 15:00. Причина: Добавлено сообщение
alex8 вне форума   Ответить с цитированием
Старый 23.10.2016, 15:00   #5
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
До 10 тысяч записей и размер базы 2-3 мегабайта.
Port_Artur вне форума   Ответить с цитированием
Старый 23.10.2016, 15:09   #6
 
Регистрация: 22.06.2016
Сообщений: 618
Доменные сделки: 12
Реноме: 495
Одобрения
Спасибо (Отдано): 48
Спасибо (Получено): 144
Сообщение от Port_Artur Посмотреть сообщение
До 10 тысяч записей
чтобы запросы работали быстрее, добавьте к столбцам number и title индексы (это можно сделать очень легко в phpmyadmin)
alex8 вне форума   Ответить с цитированием
Старый 23.10.2016, 20:00   #7
Тех. администратор
 
Аватар для UFO
 
Регистрация: 16.03.2005
Адрес: mouse.mars
Сообщений: 10,725
Доменные сделки: 17
Реноме: 8693
Одобрения
Спасибо (Отдано): 141
Спасибо (Получено): 313
Сообщение от alex8 Посмотреть сообщение
Если таблица достаточно большая (сотни тысяч записей), то запросы к таблице работают гораздо быстрее, чем перебор массивов.
Абсолютно согласен. К тому же массивы - это текстовая часть PHP, т.е. тем самым Вы грузите сам PHP данными, а базы для того и придумали, чтобы нагрузку разделять. Конечно, 500 запросов - это немало, выполните свой запрос в PHPMyAdmin и увидите время выполнения, в принципе некоторые сайты работают с таким количество запросов на главной, это конечно не идеал, но существует.
Если сомневаетесь в скорости, то разделите запросы. Зачем Вам 500 запросов? Насколько регулярно это необходимо? Где оно будет запускаться?
Еще вариант - сделайте кэш, т.е. некий скрипт в ненагруженное время на сервере делает выборку из БД, и работает с основной массой, в течение дня в выборку попадают новые данные, ночью, к примеру, кэш снова обновляется.
__________________
Волн нет! | Whois | Полезный форум о геологии
UFO вне форума   Ответить с цитированием
Старый 01.11.2016, 18:02   #8
 
Регистрация: 19.12.2013
Сообщений: 604
Доменные сделки: 4
Реноме: 393
Одобрения
Спасибо (Отдано): 41
Спасибо (Получено): 120
Port_Artur, подробнее изложите суть проблемы.

Если нужно узнать только наличие записей, подпадающих под заданный фильтр, используйте COUNT(). Тянуть из БД фактические данные, тем более по маске * не нужно
miketomlin вне форума   Ответить с цитированием
Старый 01.11.2016, 18:39   #9
 
Аватар для Port_Artur
 
Регистрация: 03.12.2006
Адрес: Россия
Сообщений: 3,495
Доменные сделки: 24
Реноме: 1551
Одобрения
Спасибо (Отдано): 529
Спасибо (Получено): 750
Отправить сообщение для Port_Artur с помощью ICQ
Есть XML-файл с 500-ми значениями, нужно добавить в базу несуществующие, т.е. проверить каждое на вхождение в базу.
Не берём во внимание работу с XML.
Останавливаемся на цикле проверки. Нужно как можно быстрее по времени обработки, проверить по 2-м параметрам.
Port_Artur вне форума   Ответить с цитированием
Старый 01.11.2016, 19:03   #10
 
Регистрация: 19.12.2013
Сообщений: 604
Доменные сделки: 4
Реноме: 393
Одобрения
Спасибо (Отдано): 41
Спасибо (Получено): 120
Определите на этих двух параметрах составной первичный ключ или юник и попробуйте просто добавлять записи при помощи INSERT IGNORE порциями.
miketomlin вне форума   Ответить с цитированием
Ответ



Реклама

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Закладки Добавить Тема в закладки

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


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