2012-07-05 2 views
1

У меня есть большая таблица в mysql, около 1 миллиона записей.Mysql Limit Performance

Я использую динамический запрос с различными параметрами, где положение и порядок, поэтому я не можем использовать некоторый код, как AND id > 34000 LIMIT 10

У меня есть индекс на моих полях в WHERE и LIMIT и ORDER, но индекс не поможет в одиночестве.

Мне нужен лучший способ, чем LIMIT 34000, 10, Есть ли способ задержки сдвига сплава?

Я поместил свою схему таблицы, но я просто скопировал более полезное поле без какого-либо индекса, потому что я использую динамические запросы.

CREATE TABLE IF NOT EXISTS `p_apartmentbuy` (
    `property_id` mediumint(8) unsigned NOT NULL, 
    `dateadd` int(10) unsigned NOT NULL, 
    `sqm` smallint(5) unsigned NOT NULL, 
    `sqmland` smallint(5) unsigned NOT NULL, 
    `age` tinyint(2) unsigned NOT NULL, 
    `price` bigint(12) unsigned NOT NULL, 
    `pricemeter` int(11) unsigned NOT NULL, 
    `floortotal` tinyint(3) unsigned NOT NULL, 
    `floorno` tinyint(3) unsigned NOT NULL, 
    `unittotal` smallint(4) unsigned NOT NULL, 
    `unitthisfloor` tinyint(3) unsigned NOT NULL, 
    `room` tinyint(1) unsigned NOT NULL, 
    `parking` tinyint(1) unsigned NOT NULL, 
    `renovate` tinyint(1) unsigned NOT NULL, 
    `address` varchar(255) COLLATE utf8_general_ci NOT NULL, 
    `describe` varchar(500) COLLATE utf8_general_ci NOT NULL, 
    `featured` tinyint(1) unsigned NOT NULL, 
    `l_location_id` smallint(5) unsigned NOT NULL, 
    `l_city_id` smallint(4) unsigned NOT NULL, 
    `pf_furnished_id` tinyint(2) unsigned NOT NULL, 
    PRIMARY KEY (`property_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 
+0

LIMIT может быть быстрым, если запрос может использовать индекс для WHERE и ORDER BY. Не могли бы вы отправить запрос, схему ('SHOW CREATE TABLE

') и 'EXPLAIN ' output? – arnaud576875

+0

Я использую индекс в полях в 'WHERE LIMIT ORDER', но он не помогает в одиночку. И я не могу опубликовать свой запрос, потому что его динамическая схема и таблица таблиц являются большими: -s @ arnaud576875 – Hamidreza

+0

Опубликовать только один вариант запроса и (просто нужно увидеть столбцы, используемые в предложениях WHERE и ORDER BY, плюс индексы) – arnaud576875

ответ

2

Проблема с таблицей с 1 мельничных записей обыкновение быть AND id > 34000 LIMIT 10 или LIMIT 34000, 10, что будет до структуры и остальной части запроса. I.E, вам нужен индекс, PK, FK, чтобы ускорить запрос, кроме того, что заказ, вероятно, замедлит его, сделайте поиск like '%text%', он сделает ваш запрос SLOW. Также это зависит от стола. Двигатель

Так что не ожидайте, что изменение предела 10 будет иметь огромное значение. Есть несколько инструментов, которые помогут вам определить «лучший» запрос, но не все запросы работают одинаково, поэтому не ожидайте «лучшего решения», потому что его не существует.

Вы можете использовать Показать create table или Describe select ...... или explain, чтобы увидеть, что происходит, или использовать команду benchmark, чтобы увидеть примерное время функции, которую вы претендуете, чтобы улучшить его

EDIT:

Некоторые инструменты для MySQL Я порекомендую вам взглянуть на эту программу, которая поможет вам в этой части производительности.

  • Mysqlslap (это как контрольный показатель, но вы можете настроить больше результата).
  • SysBench (тестирование производительности процессора, производительность ввода-вывода, конкуренция мьютексов, скорость памяти, производительность базы данных).
  • Mysqltuner (с этим вы можете проанализировать общую статистику, статистику хранения, статистику, показатели производительности).
  • mk-query-profiler (выполнить анализ SQL-запроса).
  • mysqldumpslow (полезно знать, что вопросы ведьмы вызывают проблемы).
+0

Im не использует низкопроизводительный запрос типа 'like '% text%' ', но я должен использовать' match to' в некоторых запросах. Моя самая большая проблема - это порядок по нескольким полям и задержка смещения, когда мне нужна запись в 200 000 записей – Hamidreza

+0

@ hamidreza66 Я знаю, что вы не используете, как, но я имею в виду, что у вас не может быть «лучший способ», потому что есть разные способы сделать запрос , и время отклика будет отличаться. Наиболее важной является структура базы данных и полный запрос для получения «хорошей» производительности. Я называю вас некоторыми инструментами, которые помогут найти лучшее решение – jcho360

+0

Сообщите мне об этом инструментах – Hamidreza

1

MySQL может оптимизировать LIMIT положения (то есть только сканировать/оценить строки в диапазоне, заданном ПРЕДЕЛ), если он способен использовать только индексы, чтобы найти строки, соответствующие запросу.

Для запросов, таких как SELECT * FROM users WHERE active = 1 ORDER BY created_at, добавление и индекс на (active, created_at) достаточно.

См http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

+0

Я знаю это, но что мне делать, если запрос динамический, и его возможно наличие 1 поля в где статья или поле! – Hamidreza

+0

Этот запрос предназначен для формы поиска и может возвращать все записи и не сортировать по id или любому уникальному идентификатору, я думаю, что его плохой способ использовать ограничение лимита – Hamidreza