12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
MySQL

Оптимизация обращения к БД MySQL

20.10.2018, 11:40. Показов 2944. Ответов 31

Студворк — интернет-сервис помощи студентам
Добрый день.

У меня есть массив, в котором хранятся id в определенном порядке, в котором статьи должны выводится на экран, например:
PHP
1
$poryadok = array (2,1,4,11);
Есть таблица, где находятся id (в таблице находятся больше статей, чем указано в $poryadok), title, image и text.

Я вывожу статьи в порядке предусмотренном в $poryadok.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? for($ii=0;$ii<count($poryadok); $ii++;){
 
$connection = mysql_connect ("localhost","root",""); // подключение к mysql
$db = mysql_select_db ("monkid"); //выбор базы данных monkid
mysql_query("SET NAMES 'cp1251'");
mysql_query("SET CHARACTER SET 'cp1251'");
if(!$connection || !$db) {exit(mysql_error());}
 
$interesnoe = mysql_query("SELECT * FROM interesnoe WHERE id=$poryadok[$ii]");
mysql_close();
$row = mysql_fetch_array ($interesnoe); ?>
<div><?= $row ['title']; ?> </div>
<div><?= $row ['image']; ?> </div>
<div><?= $row ['text']; ?> </div>
 
} //конец for
Получается так, что сколько элементов находится в массиве $poryadok, а в данном примере их 4, столько раз и будет обращение к MySQL.
Можно ли как-то один раз записать всю таблицу в $interesnoe, закрыть соединение с сервером MySQL, а потом вытащить уже из $interesnoe значения title, image и text, привязанные к id?

Заранее благодарен за ответ.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2018, 11:40
Ответы с готовыми решениями:

Обработка ошибок обращения к MySQL
Приветствую. Я только начинаю изучать PHP и MySQL. Дали задание произвести выборку из базы данных. С обработкой ошибок. Саму выборку...

Оптимизация запросов к MySQL
Кто хорошо разбирается в оптимизации запросов, подскажите, как оптимизировать, например, следующий запрос: SELECT ...

Оптимизация кода php+mysql
Здрасте! Проблема вот в чем - хостинг пишет что потребляю много ресурсов! На Cron повесил с десяток php скриптов заходящих в базу и...

31
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
20.10.2018, 12:48
Нужно. WHERE `id` IN(), но значительно лучше хранить в базе данных порядковый номер (в отдельном поле).
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
20.10.2018, 13:07  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
но значительно лучше хранить в базе данных порядковый номер (в отдельном поле)
Да, у каждой статьи есть свой id
id,title,image,text
1,title1,image1,text1
2,title2,image2,text2
3,title3,image3,text3

и т.д.

Добавлено через 3 минуты
Цитата Сообщение от estic Посмотреть сообщение
WHERE `id` IN()
Как потом вывести из $interesnoe необходимое значение? Если бы это был массив, то это понятно, но как в этой $interesnoe хранятся данные, я не знаю.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
20.10.2018, 13:25
Цитата Сообщение от alanat Посмотреть сообщение
Как потом вывести из $interesnoe необходимое значение?
PHP
1
2
3
while (false !== ($row = mysql_fetch_array($interesnoe))) {
    var_dump($row);
}
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
20.10.2018, 16:29
Цитата Сообщение от alanat Посмотреть сообщение
Да, у каждой статьи есть свой id
Речь шла не об этом поле. Хотел это уточнить, но не стал, потому что это и так должно быть понятно.

Цитата Сообщение от alanat Посмотреть сообщение
Как потом вывести из $interesnoe необходимое значение? Если бы это был массив, то это понятно, но как в этой $interesnoe хранятся данные, я не знаю.
Есть несколько разных способов получить записи в массиве. Если бы использовали современное расширение MySQLi, можно было воспользоваться методом fetch_all. Правда, в данном случае это мало что дает. Проще "собрать" массив в цикле while, проиндексировав его элементы идентификаторами записей из выборки, а вывод делать по вашему массиву $poryadok, не забыв проверять существование очередной выводимой записи в сформированном в цикле while массиве. Чтобы всего этого избежать, нужно делать так, как я написал:
значительно лучше хранить в базе данных порядковый номер (в отдельном поле)
Также возможно, что вы неправильно описали задачу, и вам будет достаточно использовать какой-нибудь более простой порядок, например по убыванию значения id.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
20.10.2018, 21:41  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
достаточно использовать какой-нибудь более простой порядок, например по убыванию значения id
В данный момент я справляюсь просто средствами php: создал массив и из него беру данные.
Вот, например один из элементов массива:
PHP
1
$mpcard[1659] = array (5999,"68-74-80","синий","100% лебяжий пух","comb","Детский комбинезон","/images/comb/","Detsky-kombinezon","-Moncler","Moncler ","13 000","Китай","Монклер",5200);
Таких элементов, конечно, гораздо больше.
Я создал шаблон, в который подставляются данные из массива. Например, если в шаблоне необходимо прописать адрес до изображения, я прописываю:
PHP/HTML
1
2
$ino = 1659; //для простоты написал так, но в реале делаю это через for
<div class="dimg"><img src="<?=$mpcard[$ino][6]"><?=$mpcard[$ino][7]"><?=$mpcard[$ino][8]">-$ino.jpg</div>
Со временем массив стал разрастаться, и его стало неудобно читать. Создавать разные файлы с массивами тоже не удобно. Вот и пришла мысль воспользоваться MySQL. Из массива-то я знаю, как достать какое-то одно значение, например, как здесь для id1659:
PHP
1
<?=$mpcard[$ino][8]">
и я получу значение "-Moncler" (и подставлю его потом в шаблон), а вот как достать это же значение из MySQL, я не знаю.

Создал я таблицу: id=>1659, потом path_img => "/images/comb/" и т.д.
Потом всё то же самое для 1670, 1654 и т.д.

И планировал так же доставать значения из таблицы (как делал из массива), но не так, чтобы: подключился к базе, считал значение, закрыл подключение. И так открывать таблицу за каждым значением.
Хотелось бы, чтобы: подключился к базе, считал значения, записал в переменную, закрыл подключение. И дальше доставать по одному необходимому значению уже не из таблицы, а из переменной, которая бы вобрала в себя всю таблицу.
Всё, что я нашёл в интернете - это как вывести либо все столбцы, либо как только одно какое-то значение, либо все значения из столбца, но то, как я описал, я не нашел.
Так и придется работать с php-массивом или доставать из MySQL по одному значению (подключаясь и почти сразу отключаясь от базы), что будет нагружать MySQL и снижать производительность.
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
20.10.2018, 22:45
Существует шаблон проектирования Active record (AR). Но по-моему он вам не нужен, хотя я по-прежнему не понимаю, какие у вас еще остаются проблемы после данных в этой теме объяснений.

Откуда берется $poryadok? При использовании баз данных в коде не должно оставаться практически никаких фактических данных. Если у вас имеются какие-то проблемы с организацией структуры базы данных, можете мне написать.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
20.10.2018, 22:48  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Откуда берется $poryadok?
Похоже, что из головы - это то, в каком порядке должны появляться товары (с их id) на сайте.
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
20.10.2018, 23:03
Вы хотите, чтобы PHP залез вам в голову?

Если определить массив с порядком в коде, то вы можете воспользоваться предложенным мной способом в сообщении #5. Но, как было написано там же, порядок лучше тоже хранить в базе данных. В отдельном поле. Или на худой конец жонглировать идентификаторами.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
20.10.2018, 23:27  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Вы хотите, чтобы PHP залез вам в голову?
Порядок уже есть, и он - 2,1,4,11 - это номера id.
0
Невнимательный
 Аватар для ft4l
3118 / 1302 / 359
Регистрация: 08.02.2013
Сообщений: 7,627
Записей в блоге: 2
21.10.2018, 00:35
SQL
1
SELECT * FROM `table` WHERE id IN(2,5,1,7) ORDER BY FIND_IN_SET(id, '2,5,1,7')
не знаю насколько кривое решение, и есть-ли более прямые

Добавлено через 12 минут
тоже с другого боку
SQL
1
SELECT * FROM `table` WHERE id IN(2,5,1,7) ORDER BY FIELD(id,2,5,1,7)
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
21.10.2018, 09:55  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
тоже с другого боку
Вот! И каждый раз приходится обращаться к таблице. А мне необходимо считать её только один раз, например
PHP
1
$interesnoe = mysql_query("SELECT * FROM interesnoe);
далее разорвать соединение с MySQL и работать только с $interesnoe.


Простой пример: имеется таблица tablitsa с тремя столбцами id, title и text, в каждом столбце имеются какие-то данные: 1-title1-tetx1 (это в первой строке), 2-title2-text2 (это во второй строке) и т.д. Я выбираю из таблицы все данные:
PHP
1
$tablitsa = mysql_query("SELECT * FROM tablitsa");
закрываю соединение с MySQL. Всё, у меня остаётся только $tablitsa. Как из $tablitsa вытащить значение равное text2?
0
Невнимательный
 Аватар для ft4l
3118 / 1302 / 359
Регистрация: 08.02.2013
Сообщений: 7,627
Записей в блоге: 2
21.10.2018, 10:39
значит неправильно понял суть вопроса
ORDER BY FIELD(id,2,5,1,7) и пытался сделать для того чтобы ряды уже были отсортированы в нужном порядке...
а так, если для какого-то другого повторного использования,
придётся все эти данные копировать в память(переменную),
типа в цикле делать $rows[] = mysql_fetch_array($interesnoe)
и потом использовать массив $rows

как вариант можно попробовать юзать mysql_data_seek ($interesnoe,0);
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.10.2018, 10:48
Цитата Сообщение от alanat Посмотреть сообщение
Вот! И каждый раз приходится обращаться к таблице. А мне необходимо считать её только один раз, например
А в примере выше не 1 обращение? Хотя ORDER BY я бы убрал и сделал сортировку на стороне php.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
21.10.2018, 11:40  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
типа в цикле делать $rows[] = mysql_fetch_array($interesnoe)
Это то, с чего я начал тему. Только получается, что при помощи $row ['title'] я могу считать только то, что находится в считанной строчке. Вот если бы вывести, что-то вроде $row [1,'title'], типа 1 - это id, а вместо title выводится то, что находится в таблице на пересечении 1 и title. Есть ли какой-то оператор, который так делает? (Ну из массива же я могу таким образом достать значение, может быть и здесь по аналогии есть).
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
21.10.2018, 11:44
Цитата Сообщение от alanat Посмотреть сообщение
Как из $tablitsa вытащить значение равное text2?
Я же вам написал. Сформируйте массив записей из выборки, проиндексированный идентификаторами записей.

Но для вывода в цикле это не требуется. Просто вы выбрали самый неудачный для этого тип цикла.
0
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
21.10.2018, 11:47  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А в примере выше не 1 обращение?
Да, одно обращение, там считывается сразу вся строчка (2,5,1,7). А как потом из строчки вытащить значение какого-то столбца в отдельности?
Как в данном случае, считываем строчки 2,5,1,7, а потом вывести значение столбца title из строчки 5, и больше ничего не выводить.
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
21.10.2018, 11:59
PHP
1
2
3
while ($row=mysqli_fetch_assoc($interesnoe)) {
    $tablitsa[array_shift($row)]=$row;
}
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.10.2018, 12:00
Цитата Сообщение от alanat Посмотреть сообщение
Как в данном случае, считываем строчки 2,5,1,7, а потом вывести значение столбца title из строчки 5, и больше ничего не выводить.
А зачем запрашивать больше данных, чем надо. Если нужна только строка с id 5, то и в запросе следует получить только ее.
0
Невнимательный
 Аватар для ft4l
3118 / 1302 / 359
Регистрация: 08.02.2013
Сообщений: 7,627
Записей в блоге: 2
21.10.2018, 12:02
PHP
1
2
3
4
5
while ($row = mysql_fetch_row($interesnoe)) {
    $id = array_shift($row);
    $rows[$id] = $row;
// если id в результатах первый и нужен не ассоциативный массив
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2018, 12:02
Помогаю со студенческими работами здесь

PHP+MySQL оптимизация при подщете количества записей в каждой категории
Доброго времени суток всем! Столкнулся со следюющей проблемой: есть сайт с обявлениями, на нем много категорий, по каждой из которых надо...

Оптимизация кода PHP+MYSQL. При большом количестве посетителей: ошибка 500
Эти кодом я вывожу тумбы к видео на страницу из базы и их названия. &lt;?php $video = mysql_query ('SELECT id,title,page,img,duration FROM...

Перезапуск обращения к mysql (выбрать заного)
Всем привет. Задался вопросом. Вот к примеру есть выборка 1 ид рандомно из таблицы $query_rand = mysqli_query($link, &quot;SELECT * FROM...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был создан миф. Это миф о цветовой индефикации...

Mysql запрос оптимизация
красткая структура базы: gorod id name magazin id id_gorod name comments id


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru