|
|
|
| Не могу справится с выборкой используя ИНДЕКСНЫЙ КЛЮЧ
Имеем таблицу:
CREATE TABLE TOWNS (
id tinyint(4) NOT NULL auto_increment,
region_code char(3) NOT NULL default '',
areas_code char(3) NOT NULL default '',
towns_code char(3) NOT NULL default '',
towns_txt varchar(30) NOT NULL default '',
PRIMARY KEY (id),
KEY K_towns_code (region_code, areas_code, towns_code)
) TYPE=MyISAM COMMENT = 'Населённые пункты в районах данной области';
Индекс KEY K_towns_code (region_code, areas_code, towns_code), как раз и сделан для получения УПОРЯДОЧЕННОГО вывода, т.к. по ДОКам можно указать ЛЮБОЕ имя столба для упорядочивания
SELECT * FROM `TOWNS` ORDER BY `K_towns_code`
Ошибка SQL-запрос : SELECT * FROM `TOWNS` ORDER BY `K_towns_code`
Ответ MySQL: Unknown column 'K_towns_code' in 'order clause'
Из сообщения видно, что ИНДЕКС воспринимается как ПОЛЕ и мускуль пытатается это поле найти
Как ПРАВИЛЬНО я должен составить запрос в этом случае ??? | |
|
|
|
|
|
|
|
для: boris07
(26.06.2007 в 09:57)
| | Вы не можете сортировать по имени ключа, указывайте столбцы, соответствующие ключу
SELECT * FROM `TOWNS`
ORDER BY region_code, areas_code, towns_code
|
Ключ в этом случае подцепится автоматически. | |
|
|
|
|
|
|
|
для: cheops
(26.06.2007 в 11:15)
| | Я и НЕ ХОЧУ СОРТИРОВАТЬ, я хочу просто выбрать по этому индексу, в нём уже УПОРЯДОЧЕННАЯ таблица по этим полям.
ИМЕННО избежать сортировки мне и хочется, но выбрать по сортировке соответствующей установленному индексу !!!!!! | |
|
|
|
|
|
|
|
для: boris07
(26.06.2007 в 16:38)
| | Вы не можете обращаться к индексам напрямую.
Только к полям, их образующим.
Индексы применяет оптимизатор движка. | |
|
|
|
|
|
|
|
для: Trianon
(27.06.2007 в 11:33)
| | Это не совсем так.........
Вот например в этом мануале http://dev.mysql.com/doc/refman/5.0/en/index-hints.html
имеется такой Examples:
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
и там же http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
SELECT key_part3 FROM tbl_name
WHERE key_part1=1
Беда ТОЛЬКО в том, что приведённые примеры НЕ РАБОЧИЕ, очевидно где-то "ОЧЕПЯТКИ" закрались в текст!!!!
Но сам факт использования индексов НА ПРЯМУЮ имеет место бытьПоэтому я и спрашиваю у ЗНАЮЩИХ людей, которые эту проблему УЖЕ РЕШИЛИ !!!
Индексы во ВСЕХ БАЗАХ можно использовать напрямую, вот только как это делает мускуль ??? | |
|
|
|
|
|
|
|
для: boris07
(27.06.2007 в 14:46)
| | Еще раз.
Вы не можете обращаться к индексам.
Вы можете попросить сервер учесть тот или иной индекс, но не более того.
Содержание результата исполнения запроса сервером от индекса не зависит.
Может зависить лишь скорость получения этого результата. | |
|
|
|
|
|
|
|
для: Trianon
(27.06.2007 в 18:01)
| | А куда прикажете деть БУРЖУЙСКИЕ примеры по выборке используя индексные файлы :-))
Нет, здесь всё не так просто..... Обращаться то видно всё таки можно, иначе примеров бы не было, но возможно в тексте опечатки.... вот моё тестирование и не получается.
Я и не говорил, что СОДЕРЖАНИЕ МОЖЕТ или ДОЛЖНО зависеть от индекса, это чушь собачья, а вот ГЛАВНОЕ из-за чего копья ломаются - СКОРОСТЬ ВЫПОЛНЕНИЯ ЗАПРОСА !!!!
== Типовой подход, гласит так -> ВЫБРАТЬ (список полей и/или связанных полей) ИЗ таблицы УЧИТЫВАЯ индекс ПОКА (условия) и т.д.
В нотации могут и АЛИАСЫ присутствовать..............
Другое дело, Вы по всему похоже, просто не в теме - запомнили себе одно "НЕЛЬЗЯ ОБРАЩАТЬСЯ" и всё тут... и не хотите посмотреть на проблему пошире, хотя бы через буржуйский мануал.......
Хочу перефразировать известный одесский анекдот -"... Всю Одессу удовлетворяет, а его видите ли НЕТ..", так здесь я могу сказать так - "Во ВСЕХ базах использование индекса есть, а в MySQL видете ли нет !!!!" - ТАК ПРОСТО НЕ МОЖЕТ БЫТЬ, потому что не может быть никогда !!!! НАДО ИСКАТЬ !!! | |
|
|
|
|
|
|
|
для: boris07
(27.06.2007 в 20:50)
| | применять USE INDEX, FORCE INDEX, IGNORE INDEX Вам никто не мешает.
Но Вы же этого в своем примере не написали?
При чем тут упорядоченность вывода?
Порядок вывода достиагется конструкцией ORDER BY. А не USE INDEX.
==== из мануала:
Выражение FROM table_references задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Информацию о синтаксисе объединения можно найти в разделе Раздел 6.4.1.1, «Синтаксис оператора JOIN». Для каждой заданной таблицы по желанию можно указать псевдоним.
table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
В версии MySQL 3.23.12 можно указывать, какие именно индексы (ключи) MySQL должен применять для извлечения информации из таблицы. Это полезно, если оператор EXPLAIN (выводящий информацию о структуре и порядке выполнения запроса SELECT), показывает, что MySQL из списка возможных индексов выбрал неправильный. Если нужно. чтобы для поиска записи в таблице применялся только один из возможных индексов, следует задать значение этого индекса в USE INDEX (key_list). Альтернативное выражение IGNORE INDEX (key_list) запрещает использование в MySQL данного конкретного индекса.
В MySQL 4.0.9 можно также указывать FORCE INDEX. Это работает также, как и USE INDEX (key_list) но в дополнение дает понять серверу что полное сканирование таблицы будет ОЧЕНЬ дорогостоящей операцией. Другими словами, в этом случае сканирование таблицы будет использовано только тогда, когда не будет найдено другого способа использовать один из данных индексов для поиска записей в таблице.
Выражения USE/IGNORE KEY являются синонимами для USE/IGNORE INDEX==== | |
|
|
|
|
|
|
|
для: Trianon
(27.06.2007 в 22:21)
| | Нам осталось совсем немного... только УБЕДИТСЯ, что указанные в мануале примеры РАБОТАЮТ !!!
Пополним указанную, в начале темы, таблицу......
INSERT INTO REGION VALUES ('0','34', 'Костромская обл.');
INSERT INTO REGION VALUES ('0','66', 'Смоленская обл.');
INSERT INTO REGION VALUES ('0','46', 'Московская обл.');
INSERT INTO REGION VALUES ('0','79', 'Республика Адыгея');
INSERT INTO REGION VALUES ('0','05', 'Приморский край');
И.... используем приведённый пример......
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
Соответсвенно поставив наши значения в ТАБЛИЦУ и в key_list
Посмотрим.... что же такое получится в результате этого запроса !!!!!!!! | |
|
|
|
|
|
|
|
для: Trianon
(27.06.2007 в 22:21)
| | Прошу простить ..... вот та таблица которую надо пополнить (вариант попроще, ТОЛЬКО одно поле для индексирования)
CREATE TABLE REGION (
id tinyint(4) NOT NULL auto_increment,
region_code char(3) NOT NULL default '',
region_txt varchar(30) NOT NULL default '',
timeEnter timestamp(14),
PRIMARY KEY (id),
UNIQUE KEY K_region_code (region_code)
) TYPE=MyISAM COMMENT = 'Области'; | |
|
|
|
|
|
|
|
для: Trianon
(27.06.2007 в 11:33)
| | И ещё дополнение...
если я обращаюсь к полям ОБРАЗУЮЩИМ ИНДЕКС (неважно какой, моет быть и уникальным), то КАЗАЛОСЬ БЫ.... я вправе ожидать выдачи результата в порядке этого индекса !!!! Но не тут- то было !!!!!! Записи (row) выдаются ТОЛЬКО в порядке их попадания в таблицу, это если их НЕ СОРТИРОВАТЬ в дальнейшем !!!
Предположим, к индексу нельзя обращаться напрямую, но каким образом можно использовать В МОИХ ИНТЕРЕСАХ то что в нём имеется ??? А если нельзя использовать, то какой оптимизатор и какого такого движка их использует и ДЛЯ ЧЕГО ???? | |
|
|
|