2010-12-10 3 views
2

Я искал решение для этого, но, увы, не было ничего.MYSQL large LIMIT offset

В настоящее время мой стол толкает 5 800 000 рядов, из 5000 различных источников. Например:

CREATE TABLE stores(
    store_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT, 
    name VARCHAR(255) 
); 

CREATE TABLE articles(
    article_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT 
    article_name CHAR(80), 
    article_price INT UNSIGNED, 
    store_id INT UNSIGNED 
); 

Ok, так что я сделал индексы, как так:

CREATE INDEX article ON articles(store_id,name); 

И я думал, что я сделал это пуленепробиваемым, угадай нет.

Когда я поиск больших наборов данных, 200 000 статей, им выдающие:

SELECT article_name, 
     article_price 
    FROM articles 
    WHERE store_id = $id 
ORDER BY article_name 
    LIMIT 100000,20; 

и получать очень большие времена ответа. Помоги пожалуйста? : S

ответ

0

Вы пробовали два отдельных индекса на store_id и article_name? Это может обеспечить более эффективную фильтрацию и упорядочивание MySQL. Вы также можете подумать о переносе этого запроса в хранимую процедуру, чтобы MySQL мог кэшировать исполняемые/подрезультатные наборы. Если это не работает, вы можете рассмотреть количество операций вставки/обновления/удаления, которые происходят в этой таблице. Если они высоки, вы можете рассмотреть возможность репликации на рабочую базу данных, где происходят все операции чтения. Если это не работает, вы можете обновить свое оборудование, так как MySQL может легко обрабатывать таблицы такого размера.

+0

В основном эта таблица разгорается весь день. 24/7 У меня есть вставки и обновления. У меня есть глобальный индекс для article_name, а не для store_id. Я не думаю, что отдельный индекс id будет делать что угодно. Я использую таблицу myisam, это хорошая идея, потому что она использует блокировку таблиц, это то, что возится с моей работой? Повторяю, таблица постоянно обновляется и имеет много вставок в день. EDIT: я включена медленный запрос, и это то, что я получаю # Query_time: 7 Lock_time: 0 Rows_sent: 24 Rows_examined: 8224 Btw, коробка VPS с XEON E5520, но у меня есть только 2 центрального процессора сердечников и 3 ГБ ОЗУ. – Rob 2010-12-10 10:13:47

1

Да, хорошо я понял это, так как никто не поможет мне: D

Идея заключается в следующем, когда я reguest некоторые страницы я сделать следующее:

CREATE ВРЕМЕННОЙ результат TABLE (row_id, article_id); SET @row: = 0; INSERT INTO результат SELECT @row: = (@ row + 1), article_id FROM articles ORDER BY $ sort $ order;

, а затем простой SELECT/JOIN:

SELECT * FROM результат LEFT JOIN статей по result.article_id = articles.article_id ГДЕ row_id> = $ от И ROW_ID < $ до;

Cheers ...

+0

Разве это все еще работает для вас из обзора производительности? Можете ли вы предоставить более подробную информацию о своей среде? – 2011-08-19 22:13:29

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