Какой запрос MySQL будет иметь более быстрый поиск? - PullRequest
1 голос
/ 21 февраля 2012

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

$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  

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

1 Ответ

1 голос
/ 21 февраля 2012

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

для создания столбца и индексации вы используете что-то вроде этого (для 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 и, таким образом, это будет ваш первичный ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...