Уменьшить время обработки

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Уменьшить время обработки

Сообщение JohnK » 22.11.2009 (Вс) 14:59

На PHP пишу что-то типа биллинга для себя. Делаю выборку из базы mySQL для определения даты и времени последней активности пользователя. База пока не большая около 56 Mb, но для каждого пользователя затрачивается примерно по 1 сек. Как можно уменьшить время обработки запроса? Можно ли как-то сказать базе искать первое совпадение по IP с "конца" таблицы?
Запрос делаю так:
Код: Выделить всё

SELECT * FROM `traff` WHERE (`IP`="192.168.0.100") ORDER BY DESC LIMIT 1

Но, как сказал хочу уменьшить время (ну в самом деле, зачем пролистывать всю таблицу! Если можно взять последнюю запись с этим IP)
Спасибо заранее!
Последний раз редактировалось JohnK 22.11.2009 (Вс) 15:13, всего редактировалось 2 раз(а).
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 15:02

JohnK писал(а):
Код: Выделить всё
$result = mysql_query('SELECT * FROM `traff` WHERE (`IP`="192.168.0.100") BY ORDER DESC LIMIT 1') or die(mysql_error()); 

Чего?? 0_o
Запрос, мягко говоря, неправильный. Он не может работать.
label:
cli
jmp label

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Уменьшить время обработки

Сообщение JohnK » 22.11.2009 (Вс) 15:05

Гм. я для примера привел:
SELECT * FROM `traff` WHERE (`IP`="192.168.0.100") ORDER BY DESC LIMIT 1

PS. Привел по памяти, сейчас нет под рукой исходника, но запрос рабочий выдает последнюю запись.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 15:35

JohnK писал(а):Гм. я для примера привел:
SELECT * FROM `traff` WHERE (`IP`="192.168.0.100") ORDER BY DESC LIMIT 1

Ну вот уже ближе. Только order by "что"?

Какие колонки есть в таблице, какие индексы? Есть ли счётчик, или хотя бы метка времени?

UPD: Вообще такой запрос на таблице в 54 метра секунду работать не может. Это СЛИШКОМ много. У меня - 47мс. на 400 метровой таблице на 800к записей.
Для ускорения запроса тебе нужен индекс по счётчику(или метке времени) и иднекс по IP. Соответственно, запрос будет "order by [метка времени] desc"...
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 16:26

IP хранится в виде СТРОКИ?? Изображение Изображение Изображение
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Уменьшить время обработки

Сообщение JohnK » 22.11.2009 (Вс) 17:16

ANDLL писал(а):IP хранится в виде СТРОКИ??


Да, а что здесь криминального? Какие есть варианты?

формат таблицы таков:
unic_id
date
time
ip
bytes_in
Bytes_out

Вот сие чудо:
Код: Выделить всё
Select max(unic_id) FROM `traff` WHERE (`IP`="192.168.0.100")

Выдает номер записи, как я понимаю. А как дальше извлечь данные?

PS
В PHP и MySQL новичок, поэтому рассчитываю на толковое изъяснение материала. Если нет желания или нет знаний, просьба не тратить свое и мое время. Спасибо за понимание.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Уменьшить время обработки

Сообщение alibek » 22.11.2009 (Вс) 17:19

JohnK писал(а):Какие есть варианты?

long/dword, разумеется.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 17:25

ANDLL писал(а):IP хранится в виде СТРОКИ?? Изображение Изображение Изображение

Гм. Ну в общем-то да. Для логов, по которым не нужен поиск это ещё хоть как-то, а для всего остального -
inet_aton('192.168.0.1') + inet_ntoa(ip) + int unsigned
Ну или ip2long и long2ip в пыхыпе. Но лучше юзать родные функции mysql.

JohnK писал(а):Select max(unic_id) FROM `traff` WHERE (`IP`="192.168.0.100")

select * from traff where ip = '192.168.0.100' order by unic_id desc limit 1

Только ip преобразуй в число, и сделай по нему индекс. Ну или ХОТЯ БЫ просто сделай по нему индекс.
label:
cli
jmp label

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Уменьшить время обработки

Сообщение JohnK » 22.11.2009 (Вс) 18:10

Судя по всему задержка из-за того что храню ip как строку. Только IpToLong() возвращает отрицательные числа...
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 18:30

И ты полагаешь что должен обязательно положительные?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Уменьшить время обработки

Сообщение JohnK » 22.11.2009 (Вс) 20:18

Да в принципе все равно главное - достижение поставленной задачи.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 20:35

Не, главное это набраться ума.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 21:08

JohnK писал(а):Судя по всему задержка из-за того что храню ip как строку. Только IpToLong() возвращает отрицательные числа...

Задержка у тебя - из-за того, что у тебя нет индекса по этому полю. Можно и на строковое поле индекс навесить, и работать будет быстро.
Только места больше занимать раза в четыре, ну и всё равно помедленнее, чем с числами.

Плюс у тебя могут быть косяки с отрицательными числами на 32битной машине, поэтому лучше используй не iptolong, а mysql'евский inet_aton при записи, и inet_ntoa при чтении/выборке.
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 22:19

iGrok писал(а):Плюс у тебя могут быть косяки с отрицательными числами на 32битной машине
Какие еще косяки? Не несите... Ну вы поняли чего
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 23:11

ANDLL писал(а):
iGrok писал(а):Плюс у тебя могут быть косяки с отрицательными числами на 32битной машине
Какие еще косяки? Не несите... Ну вы поняли чего

Понял, понял.
ANDLL, Вы, помнится, с mysql как раз не особо дружили, так что не надо гнать. Я несу ровно то, с чем сам сталкивался.

32битная машина, 32-битная система. В mysql поле int unsigned, ip2long даёт отрицательное число. При инсерте отрицательное число сбрасывается в 0. Способов решения - два, либо убирать unsigned из описания поля, и хранить в нём отрицательные числа, но забыть про inet_ntoa / inet_aton, и все операции по конвертированию производить "ручками" на пхп перед запросом (ip2long, long2ip), либо прибавлять к IP 2147483647(0x7FFFFFFF) (если не ошибаюсь) перед сохранением (это вообще гемор, т.к. перед вызовом long2ip нужно вычитать это число обратно, так что крайне не рекомендую).
Третий вариант - перейти на 64бит систему.

Ы?

UPD:
0x7FFFFFFF, а не 0x7FFFFF, разумеется.
Последний раз редактировалось iGrok 22.11.2009 (Вс) 23:52, всего редактировалось 1 раз.
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 23:28

iGrok писал(а):ANDLL, Вы, помнится, с mysql как раз не особо дружили, так что не надо гнать
Помнится?
Ну а как поможет 64-битная ОС?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 22.11.2009 (Вс) 23:49

ANDLL писал(а):
iGrok писал(а):ANDLL, Вы, помнится, с mysql как раз не особо дружили, так что не надо гнать
Помнится?
Ну а как поможет 64-битная ОС?

Угу. Помнится. Из темы про "падучесть" MyISAM на ровном месте. С тех пор многое могло измениться, не спорю. Так что если я ошибся - что ж, приношу извинения.

А под 64битной OC ip2long в php возвращает 64битный int. Беззнаковый.

З.Ы. Насчёт ОС я возможно погорячился. Возможно, хватит процессора с EM64T. Но факт:
На P4 3.0 и 32bit FreeBSD - ip2long('128.0.0.1') выдаёт int(-2147483647).
А на моём amd turion и XP32bit, также как и на DualXeon + 64bit FreeBSD - int(2147483649).
Последний раз редактировалось iGrok 22.11.2009 (Вс) 23:58, всего редактировалось 1 раз.
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 22.11.2009 (Вс) 23:55

Так 64-битный PHP, он как бе вообще никакого отношения к MySQL не имеет...
Из темы про "падучесть" MyISAM на ровном месте
Ты наверное меня перепутал с каким нибудь Хакером :lol: Меня падучесть MyISAM никогда не волновала.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 23.11.2009 (Пн) 0:09

ANDLL писал(а):Так 64-битный PHP, он как бе вообще никакого отношения к MySQL не имеет...
Из темы про "падучесть" MyISAM на ровном месте
Ты наверное меня перепутал с каким нибудь Хакером :lol: Меня падучесть MyISAM никогда не волновала.

Не. Погоди. По полочкам:
MySQL тут вообще нигде ни при чём. Кроме, разве что, её inet_ntoa и inet_aton, которые ВСЕГДА выдают unsigned 32bit int вне зависимости от условий.

"При чём" тут пыхыпэ.
1) На 32бит системе(всё-таки похоже железо, а не ОС, иначе я вообще не вижу закономерности) PHP выдаёт отрицательные значения для ИП больше 128.0.0.0. Если это значение попытаться записать в таблицу mysql возможны два варианта:
а) поле int signed - запишется отрицательное число, и всё будет работать, но не будут работать "родные" inet_ntoa, inet_aton в запросах.
б) поле int unsigned - запишется 0 для любого IP старше 128.0.0.0.

2) На 64бит системе - PHP выдаёт положительные числа, int - 64битный, всё работает, всё ок.

При этом если не использовать ip2long, а юзать только mysql inet_aton / inet_ntoa проблем не возникнет ни там ни там и всё везде будет работать одинаково. Именно поэтому я и советую использовать именно эти функции, а не пыхыпэшное ip2long. :roll:

А с Хакером я тебя не путал, там речь шла про какой-то очередной глюк форума, Хакер сказал, что на ровном месте побилась одна из табличек, а следующий пост был твоим - из разряда "записать себе никогда не использовать мускул". :)
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Уменьшить время обработки

Сообщение ANDLL » 23.11.2009 (Пн) 0:13

А с Хакером я тебя не путал, там речь шла про какой-то очередной глюк форума, Хакер сказал, что на ровном месте побилась одна из табличек, а следующий пост был твоим - из разряда "записать себе никогда не использовать мускул"
Да, было
На 32бит системе(всё-таки похоже железо, а не ОС, иначе я вообще не вижу закономерности)
Ну очевидно все таки версия PHP, а не ОС или железо(разумеется с учетом того что 64-битная ось на x86 не запустится, а 64-битный php не запустится на 32-разрядной ОСИ, какое бы там не было железо)
MySQL тут вообще нигде ни при чём.
Ну блин я пропустил когда мы с бд перешли на реалзиацию и языку
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 23.11.2009 (Пн) 1:45

Гм. Да, меня почему-то сглючило, будто на моей xp32 php ip2long выдавал 64битное значение. Я ещё задумался, с чего это он, и отнёс это на счёт проца с amd64. Сейчас перепроверил - отрицательное - 32 бит.
Так что таки да. Версия php. И соответствующая версия ОС и соответствующее железо.

А мы, в принципе, никуда и не переходили.. :roll:
Я увидел, что пишется это дело на пхп, и упомянул о возможной проблеме с отриц. числами на 32бит системе (железо+ос+пхп).
Ну а дальше понеслась.. :)
label:
cli
jmp label

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Уменьшить время обработки

Сообщение NashRus » 02.09.2010 (Чт) 0:54

iGrok писал(а):Угу. Помнится. Из темы про "падучесть" MyISAM на ровном месте.



Сорри, что поднимаю тему. Не нашел топика про падучесть MyISAM. Можно линк?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Уменьшить время обработки

Сообщение iGrok » 02.09.2010 (Чт) 2:27

label:
cli
jmp label


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList