[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Есть ли способ сделать быстрее обработку+запрос?
Страницы: 1, 2
GET
Привет, есть строка, в ней через запятую id таблицы tab, уже ранее отсортированные нужным образом, нужно вытащить из tab имена строк name, но уже без сортировки (т.к. она может быть сложной), а использовать уже готовую сортировку этой строки.


$str='1,90,15,79,77';
$arr=array_flip(explode(',',$str));//обратный массив строки: [1=>0,90=>1,15=>2...]

Есть запрос

if($sql=mysql->select("SELECT `id`,`name` FROM `tab` WHERE `id` IN ($str)"))
{
while($val=$sql->fetch_assoc())
{
$arr[$val['id']]=$val['name'];
}
}


Как думаете есть альтернативы такому способу, очевидно более быстрые (думаю варианты с in_array или isset буду медленнее)?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
vagrand
ABC
Это же какая такая там может быть сложная сортировка в пределах одной таблицы, чтобы нельзя было ее ускорить индексами правильными?:

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
GET
vagrand

Индексы не помогут.

Ну даже простой пример в этом запросе ...представь себе выбирается 100 строк по id ... затем делается ORDER BY по `name` индекс для `name` уже не сработает, только primary отработает для поиска id. Зато сами id внутри IN () и так уже расположены так как надо, почему бы это не использовать.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
vagrand
ABC
Цитата
затем делается ORDER BY по `name` индекс для `name` уже не сработает, только primary отработает для поиска id


Сделайте составной индекс по полям "id, name" и все у вас сработает.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
GET
vagrand
Цитата
Сделайте составной индекс по полям "id, name" и все у вас сработает.

???

id - уникальное поле, какой смысл может быть в таком индексе? smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
Цитата (ABC @ 23.11.2014 - 10:06)
id - уникальное поле, какой смысл может быть в таком индексе?

Выборку и сортировку покроет индекс.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
GET
1 белый
2 красный
3 черный
4 синий
5 желтый

Выбрать: 3,1,5
Отсортировать по имени: черный, белый, желтый

T1grOK
Может меня конечно замкнуло, но я не могу понять о чем вы говорите.

В составном индексе 1-е поле будет уникально, т.е. нашлись строки с
id=1
id=3
id=5
дальше куда деваться с `name`?

Ну вот ORDER BY `name` Какой тут индекс id+name поможет, когда id уникален???

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
ABC, ответ на твой вопрос ты можешь найти, например, тут: http://www.simplecoding.org/sortirovka-v-m...mozhnostej.html
Ищи на странице по слову FIELD

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
EXPLAIN

Цитата
EXPLAIN SELECT *
FROM `tab`
WHERE `id`
IN ( 15, 10, 20 )
ORDER BY `name`

Без составного индекса primary+name (только primary)//Using where; Using filesort

C составным индексом primary+name//Using where; Using filesort

C составным индексом id+name (primary - самостоятельный)//Using where; Using filesort

sergeiss Спасибо, читаю.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
sergeiss

Цитата
EXPLAIN
SELECT * FROM `tab` WHERE `id` IN (15,10,20)
ORDER BY FIELD (`id`,15,10,20)


Спасибо, не знал про такую команду, все сработало, НО ORDER BY все равно также отрабатывает:
//Using where; Using filesort

Я как бы из - за этого все это и начал, чтоб избежать ненужного Using filesort, когда он уже и так был однажды сделан при получении списка id: `id` IN (15,10,20)

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Не знаю, что ты там хочешь "избежать", но когда делается сама выборка, то в WHERE просто выбираются данные. Уже потом, после выборки, они сортируются. "Избежать" этого можно только одним способом: не делать либо выборку, либо сортировку.
Когда выполняется WHERE, то порядок результата не определен, вне зависимости от того, как ты укажешь перечень айдишников в списке.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
sergeiss

Цитата
Не знаю, что ты там хочешь "избежать", но когда делается сама выборка, то в WHERE просто выбираются данные. Уже потом, после выборки, они сортируются. "Избежать" этого можно только одним способом: не делать либо выборку, либо сортировку.


Да, поэтому я и не просил какие-то фичи с запросом.
Вся моя задумка с этой строкой:
Цитата
$arr=array_flip(explode(',',$str));//обратный массив строки: [1=>0,90=>1,15=>2...]


Заранее создал обратный массив, который уже включает в себя сортировку и потом запросом его заполнил.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Можно же было еще сделать так, чтоб проверять in_array, например...внутри while или через isset...

Блин, наверное со стороны это действительно смотрится, как какой-то перпетум-мобиле. smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
S.Chushkin
Да нормально это. Использовать заранее подготовленный упорядоченный по ключам массив это самый быстрый в ПХП метод для создания упорядоченного списка значений. Если надо, конечно...
п.с. Для больших списков сортировка на стороне сервера может быть быстрее, - тут уже надо сравнивать конкретный запрос с конкретным алгоритмом.


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
GET
S.Chushkin

Спасибо! Я как раз это и имел ввиду. S.Chushkin а как думаешь для мускула в среднем большие списки в этом смысле это начиная со скольких?

Несколько сотен?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.