LEOnidUKG

LEOnidUKG
Рейтинг
1776
Регистрация
25.11.2006
Должность
PHP
Интересы
Программирование
Fearful:
Конечно уважаемый, продолжайте и дальше морочить людям голову.
Ни структуры таблицы не показали, ни explain запроса из первого поста.
И правильно, зачем, пусть телепаты напрягаются.

Так легче стало на душе?

Отображает строки 6150 - 6179 ( 6,247 всего, запрос занял 6.7226 сек.)

SELECT *

FROM `cms_freepages`

WHERE `cat` =4

LIMIT 6150 , 30

EXPLAIN:

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE cms_freepages ref cat cat 4 const 6892

netwind:
Посмотрели бы уже план. Скорее всего 11 категория самая большая и он решил перебрать всю таблицу.

Да это глупости какие-то. Он самая маленькая.

Я уже убрал сортировку:

SELECT SQL_NO_CACHE id FROM `cms_freepages` WHERE cat =11

Отображает строки 0 - 29 ( 3,228 всего, запрос занял 0.0009 сек.)

EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE cms_freepages ref cat cat 4 const 3517

т.е. как бы всё очень быстро через phpmyadmin и все довольны.

Может тут что-то не так my.cnf на машине 2 ГБ памяти и 4-ре ядра.

[mysqld]

max_connections=150

safe-show-database

skip-locking

skip-innodb

skip-networking

safe-show-database

skip-name-resolve

skip-external-locking

query_cache_limit=2M

query_cache_size=128M

query_cache_type=1

max_user_connections=150

interactive_timeout=10

wait_timeout=20

connect_timeout=20

thread_cache_size=128

join_buffer_size=2M

max_connect_errors=9999999

max_allowed_packet=1M

table_cache=1024

tmp_table_size=128M

max_join_size=1000000

record_buffer=1M

sort_buffer_size=2M ## 1MB for every 1GB of RAM

read_buffer_size=2M ## 1MB for every 1GB of RAM

read_rnd_buffer_size=2M ## 1MB for every 1GB of RAM

thread_concurrency=12 ## Number of CPUs x 2

myisam_sort_buffer_size=64M

max_heap_table_size=65M

join_buffer_size=2M

key_buffer_size=300M

table_open_cache = 256

table_cache=300

table_definition_cache=300

log_queries_not_using_indexes

#log_slave_updates

log_long_format

[isamchk]

key_buffer=128M

sort_buffer=128M

read_buffer=32M

write_buffer=32M

[myisamchk]

key_buffer=128M

sort_buffer=128M

read_buffer=32M

write_buffer=32M

iopiop:
последний вариант который я вам предложил пробовали ? И все id собирать не надо, и серверу перебирать все записи не надо

Вот это?

кстати, вы не рассматривали вариант с передачей параметра типа where cat=2 and id > ... limit 25 ?

Можно расписать, что такое "id>" и откуда я его возьму? :)

---------- Добавлено 24.02.2012 в 13:28 ----------

Чёт я не врубаюсь смотрю запрос выполняется 27 секунд:

Query 27 Sorting result SELECT id FROM `cms_freepages` WHERE cat=11 ORDER BY ID

Через phpmyadmin c SQL_NO_CACHE 0,005 секунд

Я что-то не понимаю в этой жизни? :)

netwind,iopiop, да это опять доли секунды. Тут главное быстро собрать все ID категории и всё.

Fearful, конечно профессор, шли бы только мимо :)

netwind:

2 Пропускаете $page*$per_page строк с помощью функции mysql_data_seek не мучая php 37710 итерациями, как раньше. На php никакие строки не поступают.

ввести такое?

$i=0;
while ($rowclubs = @mysql_fetch_array($result))
{
if (($i>5*25)||$i<(5*25+25)) {
$arrayid[]=$rowclubs['id'];
}
$i++;
}

Ну мы тем самым лишь уменьшаем сам массив, это опять же доли секунды.

---------- Добавлено 24.02.2012 в 03:33 ----------

2 Пропускаете $page*$per_page строк с помощью функции mysql_data_seek не мучая php 37710 итерациями, как раньше. На php никакие строки не поступают.

Да конечно.

1.Из мануала, Замечание:

Однако, плюсы использования mysql_unbuffered_query() имеют свою цену: вы не можете использовать функции mysql_num_rows() и mysql_data_seek() с результатом запроса, возвращённым этой функцией, пока не будут получены все ряды. Кроме того, вы должны будете обработать все ряды запроса до отправки нового запроса, используя тот же link_identifier.

2. Если мы даже применим mysql_data_seek, то нам НУЖНО количество ВСЕХ записей для составления листинга.

bimcom:
АА :) чета я пропустил сообщение что проблема решена :)

Вот тут решение проблемы: /ru/forum/comment/10080098

bimcom:
Раз в час поменялись - повторили сортировку и так на автомате.
Проверить же не сложно - будет толк на вашей системе или нет, заодно оцените сколько выполняется сортировка и если после неё запрос в 15 сек выполнится за 7 сек - это уже результат.

Да оно уже сейчас выполняется доли секунды. Опять же говорю сейчас проблема лишь как быстро считать все ID из категории 1 раз и всё.

bimcom:
Саму базу отсортировать.
ALTER TABLE `cms_freepages` ORDER BY `id` DESC

Была бы статичная Таблица, то можно было бы сделать. А так то данные меняются автоматически.

Это уже мелочь не важная. Тут самый прикол как быстро получить список всех ID в нужной категории.

Что мешает сортирнуть базу в обратном порядке и не использовать сортировку в каждом запросе?

Про какую именно сортировку вы имеете ввиду? То что она в PHP проходит?

А индекс базы полностью помещается в RAM? - памяти выделено достаточно? чтобы не перечитывать индексы с диска?

Индекс базы 15КБ, поэтому дамб весь помещается.

mysql_unbuffered_query

Не понимаю суть данной функции и чем она быстрее. Учитывая, что код идёт сверху вниз, в любом случаи пока не будет обработан и забит массив, код дальше не пойдёт выполняться. В чём смысл?

---------- Добавлено 24.02.2012 в 02:27 ----------

bimcom:
Сейчас проверил на своей базе - 400 000 записей 510МБ , 40 разных категорий

SELECT SQL_NO_CACHE * FROM `data` WHERE kat=5 ORDER BY id DESC LIMIT 37710, 30
0.8 сек.
если отсортировать базу в обратном порядке - чтобы избежать сортировки
SELECT SQL_NO_CACHE * FROM `data` WHERE kat=5 LIMIT 37710, 30
0,3 сек.
с кэшированием так ваще агонь.
PS.
kat tinyint(4)
в 5 категории 82 000 записей

Ну что я могу поделать? Вас поздравляю, у меня всё по другому и всё работает медленее. Возможно зависит от настроек или же серверной машины.

Всего: 31516