2013-07-07 3 views
1

У меня есть 1034961 строки данных из базы данных (mysql).Как улучшить производительность в mysql?

структура ..

стол: tb_blog_image

| id(pk) | link(TEXT) | img_link(TEXT) | 
    |  1  |blogpost.com/aaa|http://sky.png  | 
    |  2  |blogpost.com/aaa|http://girl.png  | 
    |  3  |blogpost.com/aaa|http://cad.png  | 

теперь, я хочу, чтобы выбрать конкретный список img_link из tb_blog_images.

SQL ..

select link, img_link 
    from tb_blog_image 
    where link = 'blogpost.com/aaa'; 

результат 38rows 6.37sec

как улучшить производительность выбора? введите ссылку в индекс? таблица нормализация?

Я хочу работать в течение 1 секунды.

Я хочу послушать различные советы.

+1

Вам нужно добавить индекс в столбец 'link' –

+1

Определенно нуждается в индексе. Нормализация столбца ссылок также может быть интересна. – Jon

+0

Вы можете добавить индекс fultext в таблицу: http://www.petefreitag.com/item/477.cfm – Gimmy

ответ

4

В идеале вы должны использовать первичный ключ (id) в своей программе.

Но в противном случае индекс в столбце ссылки решит вашу проблему. Прямо сейчас, выполняемый запрос требует, чтобы все миллионы строк из таблицы загружались с диска, а затем сравнивались со значением строки запроса. Используя индекс, это может быть уменьшено до трех или четырех дисков.

Кроме того, текстовый тип данных хранится отдельно от остальной части таблицы, что не очень эффективно. Я бы переделал два текстовых столбца на нечто вроде varchar (300), что, безусловно, достаточно долго для любого URL-адреса, который может быть встречен, но также обеспечивает более эффективное хранилище: тип TEXT действительно предназначен для (потенциально) длинных полей как заметки или содержимое веб-страниц.

+0

спасибо. Я изменяю ссылку, текст в varchar (300). и индекс. – ash84

+0

Время вашего нового запроса? – Curt

+0

выберите запрос в пределах 1сек. – ash84

1

вы выбираете данные из одной таблицы, так улучшение во время выполнения только по индексу

Можно создать несколько индексов таблицы с одним ALTER TABLE statement.This является относительно эффективным, так как кластерного индекса таблица должна быть отсканированы только один раз

Более подробно см http://dev.mysql.com/doc/innodb/1.1/en/innodb-create-index-examples.html

2

Вы можете быть заинтересованы в переменных должны быть настроены для тонких представлений.

Set global thread_cache_size = 4; 
Set global query_cache_size = 1024*1024*1024; 
Set global query_cache_limit=768*1024; 
Set global query_cache_min_res_unit = 2048; 
Set long_query_time = 5; 

Источник:

http://www.snip2code.com/Snippet/1171/List-of-Variables-to-be-set-in-MySQL-for?fromPage=1

0

Я не знаю, какой язык вы используете, кроме MySQL, но вместо того, чтобы выбрать как link и img_link колонки, вы можете выбрать id.

Код будет выглядеть примерно так:

select id 
    from tb_blog_image 
    where link = 'blogpost.com/aaa'; 

// Now Fetch The Rows 

Echo the rows using a loop one by one { 

// Inside this loop, do this 

    select link, img_link 
    from tb_blog_image 
    where link = $id 

// $id is a variable of the current row 

echo "whatever you want"; 

} 

Позвольте мне знать, какой язык вы используете, я могу помочь, если это PHP.

Дайте мне знать, если это улучшит производительность.