Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
12 / 12 / 1
Регистрация: 16.07.2012
Сообщений: 777
MySQL

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

20.10.2018, 11:40. Показов 2857. Ответов 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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,440
Записей в блоге: 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
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,440
Записей в блоге: 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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
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
3106 / 1275 / 358
Регистрация: 08.02.2013
Сообщений: 7,440
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru