2012-02-21 2 views
1

Скажем, у меня есть две таблицы. Один, давайте назовем его typeDB, для строк, состоящих из индекса, имени типа и списка идентификаторов для элементов в другой таблице, которые относятся к этому типу. Для того, чтобы получить строки из второй таблицы - позволяет называть его dataDB - типа 0, я мог бы в принципе сделать (в неаккуратной псевдокоде):Какой запрос MySQL будет иметь более быстрый поиск?

$list = SELECT list FROM typeDB WHERE index=0 

И тогда я мог бы получить строки из dataDB с помощью:

$array = explode($list) 
for (every element of list $i) 
    $results = SELECT * FROM dataDB WHERE index=$array[$i] 

Так что мой вопрос ... это быстрее, чем просто поле типа в dataDB, а затем делать:

$results = SELECT * FROM dataDB WHERE type=$type 

Моя мысль в том, что клюв ause первый метод не должен был проходить через всю базу данных, это было бы быстрее. Но я не знаю, как работают запросы к базе данных. Каким образом вы считаете себя наиболее эффективным? Благодарю.

ответ

1

Поместите указатель в колонку типа и используйте вторую версию, это будет намного быстрее. Также обратите внимание, что я думаю, что вы немного запутались в том, что такое база данных. База данных представляет собой набор таблиц (а также триггеры, хранимые процедуры, представления и т. Д.), Так что имена таблиц с именем somethingDB немного запутывают .. Когда я говорю индекс, я имею в виду индекс базы данных (ничего общего с тем, что похоже на столбец, который вы назвали индексом).

для создания столбца и индекс вы используете что-то вроде этого (для MySQL)

ALTER TABLE dataDB ADD COLUMN `type` varchar(64) 
CREATE INDEX type_index ON dataDB(type) 

аналогичные для других СУБД

Как воспитывался в комментариях, то вы должны присоединиться на колонке типа , Вы можете либо иметь таблицу, которая имеет типы, и идентификатор автоматического увеличения, и уникальное ограничение для поля типа/имени. Затем используйте идентификатор автоматического увеличения в качестве внешнего ключа или просто создайте таблицу типов с одним столбцом (тип) который является первичным ключом. В любом случае это будет работать, и у обоих есть преимущества (я бы пошел с автоинкрементным столбцом, так как считаю, что более гибко работать с кодом).

Если ты пойти со столбцом автоматического приращения вы бы это:

CREATE TABLE dataType (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(64) UNIQUE 
) 



ALTER TABLE dataDB ADD COLUMN `type` INT; 
ALTER TABLE dataDB ADD CONSTRAINT fk_type FOREIGN KEY (type) REFERENCES dataType(id); 

тогда, когда вы идете на запрос dataDB, если вы хотите, имена типов (в отличие от целых чисел), вы бы сделать присоединиться как это:

SELECT dataDB.list, dataType.name FROM dataDB 
INNER JOIN dataType ON dataDB.type=dataType.id 
where dataDB.type="$type" 

Это предполагает, типы какой-то имя, а не целые числа, чтобы начать с, хотя, если бы они были целыми числами все вместе просто сделать значение INT только столбец таблицы DATATYPE и, таким образом, было бы ваш первичный ключ.

+1

, что зависит от количества различных типов. если у него только 5 типов для 100 наборов данных, индекс никогда не будет использоваться, потому что он получил только селективность <20%. но я согласен с вашим ответом. используйте вторую версию и присоединитесь к таблице typeDB. – Basti

+0

Я бы сделал одно изменение, потому что я бы включил 'dataDB.type = '$ type" 'в спецификацию' datatType ON', чтобы ограничить соединяемые строки, так как в настоящее время вы присоедините все строки из 'dataType' на 'dataDB', даже если запрашивается только подмножество' dataType'. Не учитывать небольшие столы, но хорошая практика, когда таблица растет. –

+0

hmm интересный catch.Я никогда не понимал, какова разница между помещением дополнительных условий в предложение ВКЛЮЧАЕТ предложение WHERE. –

Смежные вопросы