Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / order by и индексы / 25 сообщений из 28, страница 1 из 2
24.10.2004, 19:56
    #32751905
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
mysql v4.0.20
Есть таблица t1(id int, str text, key(id)); - тип MyISAM.
100 000 записей, если выполнить "select * from t1 order by str", то думает 20сек. Основной вопрос : "Как ускорить процесс?".

Создал индекс : create index istr on t1(str(10)) - производительности не заметил, кроме того, expain говорит, что индекс в запросе не используется, что по мне странно... , но даже принудительное (force index) использывание не дает эффекта.

Замена типа str на varchar(30) принесла результат, но 2сек - тоже время, к тому же если база увеличится(что обычно бывает), то время, конечно, вырастет.

Есть ли у кого идеи о том, как ускорить процесс?
...
Рейтинг: 0 / 0
24.10.2004, 21:45
    #32751948
sky2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
А можно поинтересоваться с какой целью надо часто доставать все строки таблицы?

--
http://jcatki.no-ip.org/c++/bart.jpg
...
Рейтинг: 0 / 0
24.10.2004, 22:06
    #32751950
order by и индексы
сортируются с использованием индекса только поля объявленные как NOT NULL
...
Рейтинг: 0 / 0
24.10.2004, 23:53
    #32751970
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
i9Есть ли у кого идеи о том, как ускорить процесс?
Никак. Твой запрос подразумевает полное чтение таблицы, так что ускорить его можно только уменьшив таблицу.
...
Рейтинг: 0 / 0
25.10.2004, 00:53
    #32751980
sky2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Александр Прокопюксортируются с использованием индекса только поля объявленные как NOT NULL

Откуда такая информация?
...
Рейтинг: 0 / 0
25.10.2004, 10:14
    #32752198
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
sky2kА можно поинтересоваться с какой целью надо часто доставать все строки таблицы?

обычное приложение которое отображает таблицу(большую) если не через курсоры, то когда пользователь жмет на "сортировать по" сортирует клиент, а если через курсоры, то сортирует уже сервер. Склоняюсь понятное дело ко второму варианту, т.к. не охота прокачивать всю таблицу по сети => нужно чтоб сервер быстро и часто сортировал.
PS клиент не один, и как часто он будет нажимать на сортировку знает только он
...
Рейтинг: 0 / 0
25.10.2004, 10:24
    #32752213
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Sad Spirit i9Есть ли у кого идеи о том, как ускорить процесс?
Никак. Твой запрос подразумевает полное чтение таблицы, так что ускорить его можно только уменьшив таблицу.

Но одно дело сравнивать строки(не используя индексы), а другое целые числа(используя индексы)...
...
Рейтинг: 0 / 0
25.10.2004, 10:36
    #32752239
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Александр Прокопюксортируются с использованием индекса только поля объявленные как NOT NULL

Проверил на id NOT NULL, id у меня есть ключ, следовательно, он проиндексирован, так "explain select ... order by id" так же говорит о неиспользовании индексов
...
Рейтинг: 0 / 0
25.10.2004, 15:44
    #32753125
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Так что, неужто MySQL не умеет сортировать по индексам?
...
Рейтинг: 0 / 0
25.10.2004, 16:12
    #32753212
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
А с какой стати такой запрос будет использовать индекс istr? Istr индексирует только первые 10 символов. А сортировать надо по всему полю.
...
Рейтинг: 0 / 0
25.10.2004, 16:14
    #32753224
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
замените на varchar(30),
и попробуйте
select * from t1 force index (istr) order by str;
...
Рейтинг: 0 / 0
25.10.2004, 17:34
    #32753479
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Хрензамените на varchar(30),
и попробуйте
select * from t1 force index (istr) order by str;

Неа, не хочет и с varchar + force использовать индекс.
Использует только когда int + force, и то производительность аж на 6% улучшается :-(
...
Рейтинг: 0 / 0
25.10.2004, 18:09
    #32753599
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Это как это?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
explain select * from t1  force index (istr) order by str;
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | t1    | index | NULL          | istr |      31 | NULL |    2 |       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+


show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) default NULL,
  `str` varchar(30) default NULL,
  KEY `id` (`id`),
  KEY `istr` (`str`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
25.10.2004, 18:10
    #32753604
sky2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
i9Так что, неужто MySQL не умеет сортировать по индексам?
Всё он может, просто читать надо
http://dev.mysql.com/doc/mysql/ru/ORDER_BY_optimisation.html
...
Рейтинг: 0 / 0
25.10.2004, 23:40
    #32753876
order by и индексы
mysqlWith EXPLAIN SELECT ... ORDER BY, you can check whether MySQL can use indexes to resolve the query. It cannot if you see Using filesort in the Extra column.
Что значит - не встретил ты в Extra column текста Using filesort - значит всё ОК!

А насчёт значений NULL в индексных полях - это было только в 4.0.х версиях.
mysql 4.0.11Ниже приведены некоторые случаи, когда MySQL не может использовать индексы, чтобы выполнить ORDER BY:
...
Столбцы индекса могут содержать значения NULL, и используется ORDER BY ... DESC. Это объясняется тем, что в SQL значения NULL всегда сортируются в первую очередь, независимо от того, используется DESC или нет.

Сейчас уже не нахожу по хелпу. Упс, оно только в случае DESC не использует... Причём я реально видел как, меняя определение поля на NOT NULL, EXPLAIN выдавал использование индексов.

Кроме того, если не используется индекс - надо увеличить значение переменной sort_buffer, если данных будет больше этого значения - используется не совсем приятный алгоритм filesort.
...
Рейтинг: 0 / 0
26.10.2004, 00:18
    #32753882
sky2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Александр Прокопюк
Кроме того, если не используется индекс - надо увеличить значение переменной sort_buffer, если данных будет больше этого значения - используется не совсем приятный алгоритм filesort.
Кроме того, если не используется индекc - полюбому filesort
...
Рейтинг: 0 / 0
26.10.2004, 10:52
    #32754235
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
sky2k Александр Прокопюк
Кроме того, если не используется индекс - надо увеличить значение переменной sort_buffer, если данных будет больше этого значения - используется не совсем приятный алгоритм filesort.
Кроме того, если не используется индекc - полюбому filesort

Ставил sort_buffer по размеру, превышающему базу...
...
Рейтинг: 0 / 0
26.10.2004, 11:04
    #32754269
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
ХренА с какой стати такой запрос будет использовать индекс istr? Istr индексирует только первые 10 символов. А сортировать надо по всему полю.

Похоже на то, только жалко, получается, что мусклу слабо сортьровать сперва по индексу из 10 символов, а затем, если получаются спорные моменты доводить дело по полному полю... Ведь быстродействие сортировки зависит от длины строк, а тут получается, что нет разницы будет оно сортироваться по индексам или по полям целиком(раз уж мускл требует индексы такой же длины), следовательно, по времени выиграша не будет, и, следовательно, оптимизатор не будет использовать индексы, а раз так, то зачем мне их использовать? Знаю, б-деревья и все такое, но почему-то на практике у меня получилось : 0.3сек - без индексов и 0.32сек с индексами...
...
Рейтинг: 0 / 0
26.10.2004, 11:09
    #32754287
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
ХренЭто как это?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
explain select * from t1  force index (istr) order by str;
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | t1    | index | NULL          | istr |      31 | NULL |    2 |       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------+


show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) default NULL,
  `str` varchar(30) default NULL,
  KEY `id` (`id`),
  KEY `istr` (`str`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)


Глюк один обнаружился - в доках находил что для строк индексы мол нужно делать меньшей длины, вот я и делал index(10) на varchar(30), т.е. теперь да, действительно с force index индекс используется, но как я кому-то ответил: 0.3сек против 0.32сек - результат почему-то не в пользу использования индексов..?
...
Рейтинг: 0 / 0
26.10.2004, 18:03
    #32755597
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
i9но как я кому-то ответил: 0.3сек против 0.32сек - результат почему-то не в пользу использования индексов..?
при использовании индекса читается вся таблица и весь индекс,
при неиспользовании индекса --- только вся таблица...
...
Рейтинг: 0 / 0
26.10.2004, 18:24
    #32755665
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Стоп стоп. Откуда взялась цифра 0.3 сек? В исходном собщении было что при полном сканировании эти 100000 записей сортировались за 20 сек.

Как вы измеряете? У вас там query cache случаем не включен?
...
Рейтинг: 0 / 0
27.10.2004, 10:22
    #32756275
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
Sad Spirit i9но как я кому-то ответил: 0.3сек против 0.32сек - результат почему-то не в пользу использования индексов..?
при использовании индекса читается вся таблица и весь индекс,
при неиспользовании индекса --- только вся таблица...
это понятно, не понятно почему выигрыша нет при использовании индексов, а только накладные расходы.
...
Рейтинг: 0 / 0
27.10.2004, 10:26
    #32756284
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
ХренСтоп стоп. Откуда взялась цифра 0.3 сек? В исходном собщении было что при полном сканировании эти 100000 записей сортировались за 20 сек.

Как вы измеряете? У вас там query cache случаем не включен?
нет, кэш не включен, 0.3 взялось, так как я переделал тип полей с text на varchar(30), соль-то в том, что разница между "с" и "без" индексов не та, которую хотелось бы видеть...
...
Рейтинг: 0 / 0
27.10.2004, 13:54
    #32757024
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
i9 ХренСтоп стоп. Откуда взялась цифра 0.3 сек? В исходном собщении было что при полном сканировании эти 100000 записей сортировались за 20 сек.

Как вы измеряете? У вас там query cache случаем не включен?
нет, кэш не включен, 0.3 взялось, так как я переделал тип полей с text на varchar(30), соль-то в том, что разница между "с" и "без" индексов не та, которую хотелось бы видеть...

Вы писали (не отпирайтесь)

i9Замена типа str на varchar(30) принесла результат, но 2сек - тоже время, к тому же если база увеличится(что обычно бывает), то время, конечно, вырастет.

Так где правда?

по поводу 0.3 на индекс и fullscan - то 100000 это не тот размер на котором можно проводить тестирование. У вас эта таблица где-нибудь в кэше файловой системы, или scsi диска или еще в каком нибудь кэше лежит, и вы получаете такие результаты. Обычно чтобы уменьшить погрешность от кэшей употребляется размер таблицы в 3 раза превышающий размер RAM. попробуйте.
...
Рейтинг: 0 / 0
27.10.2004, 17:26
    #32757706
i9
i9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и индексы
ХренВы писали (не отпирайтесь)
Так где правда?
Если я Вас запутал, то не обижайтесь плз. просто уже 3 дня с этим воюю, естественно, не сидел и не ждал ответов, перепробывал всякие типы, таблицы, запросы отсюда и разное время. Еще раз прошу прошения, если запутал, просто считал подать публике относительную разницу.

Хренпо поводу 0.3 на индекс и fullscan - то 100000 это не тот размер на котором можно проводить тестирование. У вас эта таблица где-нибудь в кэше файловой системы, или scsi диска или еще в каком нибудь кэше лежит, и вы получаете такие результаты. Обычно чтобы уменьшить погрешность от кэшей употребляется размер таблицы в 3 раза превышающий размер RAM. попробуйте.
С теорией не поспорю, тут Вы пожалуй правы. Гектарной базы, к сожалению у меня нет, посему, видимо, эта тема остается или до того, как база подрастет, или у кого-то найдется база и желание продолжать тему...

P.S.вообще Всем спасибо и за смену text на varchar, пустяк вроде, а намного лучше стало...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / order by и индексы / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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