Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вопрос о сотавных индексах / 11 сообщений из 11, страница 1 из 1
07.08.2013, 20:12:16
    #38358826
YuriyB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
Добрый день

вот в таком запросе

Код: plsql
1.
SELECT * FROM USER WHERE count > 2 AND ip = "$IP"



почему лучше делать индекс вида

Код: plsql
1.
ADD KEY ip_count(ip, count);  



а не вида

Код: plsql
1.
ADD KEY count_ip(count,ip);
...
Рейтинг: 0 / 0
07.08.2013, 20:48:48
    #38358862
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
C чего бы?
...
Рейтинг: 0 / 0
07.08.2013, 22:15:18
    #38358916
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
авторпочему лучше делать индекс вида
для такого запроса всё равно
...
Рейтинг: 0 / 0
08.08.2013, 05:40:38
    #38359054
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
Akina, может, с того, что у ТСа селективность по айпи выше, чем по каунту?

Кстати, даже если и не выше - при условии, что каунт всегда положителен и более-менее равномерно распределён - на использование первого индекса шансы ещё есть, на использование же второго - практически никаких, потому что под условие каунт>2 либо не попадёт вообще ни одна запись, либо попадёт как минимум треть всей таблицы :)


YuriyB, покажите вывод этого запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 1,count(*) from `user`
union all
select 2,count(distinct `ip`) from `user`
union all
select 3,count(distinct `count`) from `user`
union all
select 4,count(*) from `user` where `count`>2
...
Рейтинг: 0 / 0
08.08.2013, 10:50:30
    #38359285
YuriyB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
ScareCrowдля такого запроса всё равно

вы можете это как то аргументировать ?
...
Рейтинг: 0 / 0
08.08.2013, 12:13:21
    #38359442
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
YuriyBДобрый день

вот в таком запросе

Код: plsql
1.
SELECT * FROM USER WHERE count > 2 AND ip = "$IP"



почему лучше делать индекс вида

Код: plsql
1.
ADD KEY ip_count(ip, count);  



а не вида

Код: plsql
1.
ADD KEY count_ip(count,ip);

ИМХО так:
1.без индекса - перебор всей таблицы (TABLE SCAN) построчно в поисках count>2 и ip=$ip
2.индекс (count,ip) - поиск (INDEX SEEK) count=2, перебор строк индекса (INDEX SCAN) в поисках count>2, как только найдено - перебор остатка индекса (INDEX SCAN) в поисках ip=$ip, найденное вытаскивать из таблицы в результат
3.индекс (ip,count) - поиск (INDEX SEEK) ip=$ip, перебор строк индекса (INDEX SCAN) в поисках count>2 пока ip=$ip, найденное вытаскивать из таблицы в результат

вариант 3 априори представляется наиболее быстрым...
Но если основная масса записей с count<=2 - оптимальнее второй вариант
...
Рейтинг: 0 / 0
08.08.2013, 12:32:42
    #38359475
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
Cygapb-0072.индекс (count,ip) - поиск (INDEX SEEK) count=2, перебор строк индекса (INDEX SCAN) в поисках count>2, как только найдено - перебор остатка индекса (INDEX SCAN) в поисках ip=$ip , найденное вытаскивать из таблицы в результатНасколько я в курсе, MySQL выделенное не умеет.
Т.е. в случае с индексом (count,ip) либо будет использовано только поле count, либо индекс вообще не будет использован, если MySQL сочтет, что у условия count>2 слишком низкая селективность.
...
Рейтинг: 0 / 0
08.08.2013, 13:27:17
    #38359590
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
ip_count(ip, count);

делать лучше, потому что по IP у тебя фиксированное условие, а по count -- диапазон.

Тогда у тебя будет позиционирование в ключе по двум полям (ip, count), а потом сканирование
диапазона до конца данного значения IP.


Если делать наоборот, то надо будет делать начальное позиционирование в индексе, потом сканирование диапазона,
потом (когда кончится данный IP внутри группы одного и того же count) -- либо бесплодное сканирование далее,
до следующего count и IP, либо ещё одно позиционирование по count и IP.

В результате это всё по эффективности будет почти table scan.
А первый вариант -- почти positioning by key.
...
Рейтинг: 0 / 0
08.08.2013, 13:28:04
    #38359591
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
miksoftCygapb-0072.индекс (count,ip) - поиск (INDEX SEEK) count=2, перебор строк индекса (INDEX SCAN) в поисках count>2, как только найдено - перебор остатка индекса (INDEX SCAN) в поисках ip=$ip , найденное вытаскивать из таблицы в результатНасколько я в курсе, MySQL выделенное не умеет.
Т.е. в случае с индексом (count,ip) либо будет использовано только поле count, либо индекс вообще не будет использован, если MySQL сочтет, что у условия count>2 слишком низкая селективность.

Если он не умеет это делать, то тогда и подавно второй вариант индекса не подходит.
...
Рейтинг: 0 / 0
08.08.2013, 13:36:24
    #38359613
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
tanglirAkina, может, с того, что у ТСа селективность по айпи выше, чем по каунту?
Ну вообще я хотел заставить ТС медленно подойти к пониманию того, что всё зависит от точного текста запроса, количества данных в таблице и статистики по ним...
...
Рейтинг: 0 / 0
08.08.2013, 14:06:06
    #38359664
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос о сотавных индексах
miksoftCygapb-0072.индекс (count,ip) - поиск (INDEX SEEK) count=2, перебор строк индекса (INDEX SCAN) в поисках count>2, как только найдено - перебор остатка индекса (INDEX SCAN) в поисках ip=$ip , найденное вытаскивать из таблицы в результатНасколько я в курсе, MySQL выделенное не умеет.
Т.е. в случае с индексом (count,ip) либо будет использовано только поле count, либо индекс вообще не будет использован, если MySQL сочтет, что у условия count>2 слишком низкая селективность.Похоже, именно так дела и обстоят, то есть от (count,ip) поиск только по count, от (ip,count) - учитываются оба...
http://sqlfiddle.com/#!2/c51fe/7
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t(n int) select 1 union all select 1;

create table test1(count int, ip int, index (count,ip));

insert test1(count,ip)
select cnt,ip from(
  select @rn:=@rn+1 rn, @rn%300+1 ip, round(rand()*4,0) cnt
  from t t1, t t2,t t3,t t4,t t5,t t6, t t7,t t8,t t9,t t10,
    (select @rn:=-1)rn
  )rn;

create table test2(count int, ip int, index (ip,count))
select * from test1;

create table test3(count int, ip int)
select * from test1;

Код: sql
1.
2.
3.
4.
5.
6.
7.
set @ip=21;
-- select ip,count(*)qty,sum(if(count>2,1,0))qty2 from test2 group by ip order by qty2 desc,ip;
select * from test1 where count>2 and ip=@ip;
select * from test2 where count>2 and ip=@ip;
select * from test3 where count>2 and ip=@ip;
select count(*)qty_ip from test3 where ip=@ip;
select count(*)qty_cnt from test3 where count>2;

View Execution Plan:
(count,ip) 367 строк с count>2, из них 2 с ip=21ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA1SIMPLEtest1rangecountcount 5 367100Using where; Using index
(ip,count) 4 строки с ip=21 из них 2 с count>2ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA1SIMPLEtest2rangeipip 10 2100Using where; Using index
(без индекса) - вот тут мне не совсем ясно, всего 1024 строки в таблице, отобрано 2 - что такое 769 - хз :) ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA1SIMPLEtest3ALL769100Using where

PS MySQL - не родной, тока присматриваюсь :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вопрос о сотавных индексах / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]