|
|
|
| Здравствуйте! У меня есть таблица с заголовками на разных языках id, ru, pl, uk
Скажите есть ли смысл делать ru, pl, uk, en полнотекстовым индексом,
если при выборке используется один из языков, а сравнение происходит по примари id
то есть нужен ли мне FULLTEXT INDEX IX_Title (ru, pl, uk)
доступ к данным осуществляется через JOIN по id (всегда)
или напрямую (редко)
Спасибо! | |
|
|
|
|
|
|
|
для: freeing
(27.01.2011 в 10:43)
| | А полнотекстовый поиск по каким полям осущестувляется? Если по всем скопом, то да, такой индекс нужен, если по каждому языку в отдельности, то каждому языку нужен свой FULLTEXT-индекс.
PS С id нужно работать отдельно - для ускорения выборки по нему предназначен обычный индекс. | |
|
|
|
|
|
|
|
для: cheops
(27.01.2011 в 11:46)
| | Честно говоря поиска нет вовсе,
выборка по типу:
SELECT
t.en As Title,
b.en AS Body
-- где en это необходимый язык
FROM
data m
LEFT OUTER JOIN title t
ON m.id= t.id
LEFT OUTER JOIN body b
ON m.id= b.id
WHERE
m.Path = "/news.html";
|
Просто хочу правильно поставить индексы | |
|
|
|
|
|
|
|
для: freeing
(27.01.2011 в 11:57)
| | Тогда вам FULLTEXT-индекс не нужен, он используется только для конструкции MATCH(). Тут лучше проиндексировать поле id. В таблице, где он уникален и стоит на первом месте - сделайте его первичным ключом, а в подчиненной таблице - обычным индексом. Если таблицы у вас параллельные, т.е. в одном хранится название, а в другом текст и связь один к одному, можно в обоих id сделать первичным ключом. | |
|
|
|
|
|
|
|
для: cheops
(27.01.2011 в 12:04)
| | спасибо за грамотный ответ,
скажите а есть ли смысл переместить m.Path (смотрите запрос) на первое место,
учитывая что у меня сравнение по первичным id, через JOIN(ы),
но запрос начинается именно с m.Path
или может его вторым сделать (там правда pid для деревьев) | |
|
|
|
|
|
|
|
для: cheops
(27.01.2011 в 12:04)
| | вот полный запрос:
<?php
$query = mysql_query('
SELECT
Metadata.Created,
Metadata.Changed,
Headline.' . $language . ' AS Headline,
Description.' . $language . ' AS Description,
Keywords.' . $language . ' AS Keywords,
Content.' . $language . ' AS Content,
IF(Metadata.AID <> 0,
CONCAT_WS(SPACE(1), Author.Name, Author.Surname),
-- ELSE
NULL) AS Author
FROM
Metadata
LEFT JOIN Headline
ON Headline.UID = Metadata.UID
LEFT JOIN Description
ON Description.UID = Metadata.UID
LEFT JOIN Keywords
ON Keywords.UID = Metadata.UID
LEFT JOIN Content
ON Content.UID = Metadata.UID
LEFT JOIN Author
ON Author.UID = Metadata.AID
WHERE
Metadata.Path = IF((SELECT COUNT(*) FROM Metadata WHERE Metadata.Path = "' . $request . '") = 0,
IF("' . $request . '" = ' / ',
NULL,
-- ELSE
"/errors/404.html"),
-- ELSE
"' . $request . '") AND
Metadata.VID IN (1, 2)');
?>
|
| |
|
|
|
|
|
|
|
для: freeing
(27.01.2011 в 12:22)
| | UP | |
|
|
|
|
|
|
|
для: freeing
(27.01.2011 в 12:22)
| | А я здесь m.Path что-то вообще не вижу... | |
|
|
|
|
|
|
|
для: cheops
(01.02.2011 в 13:43)
| | Metadata.Path - я для понимания, видоизменил начальный запрос, спасибо.. | |
|
|
|
|
|
|
|
для: freeing
(01.02.2011 в 17:03)
| | А на первое место в какой конструкции хотите его поместить? Вроде в WHERE-запросе он и так на первом месте, а в конструкции FROM он не фигурирует. | |
|
|
|
|
|
|
|
для: cheops
(01.02.2011 в 17:22)
| | видимо я не так выразился.. я имею введу есть ли смысл переместить Path,
на первое место в таблице (DLL), ведь запрос начинается с Path, правильно?..
то есть что должно быть первым Path с которого начинается выборка,
или UID, так как он первый в выборке из других таблиц (JOIN) | |
|
|
|
|
|
|
|
для: freeing
(01.02.2011 в 19:39)
| | А нет... это не имеет значения, так как записи в таблице идут одна за другой. Таблица не хранится как таблица, она хранится как последовательность строк, вытянутых в одну длинную строку. | |
|
|
|