Как оптимизировать большую таблицу MySQL (биржевые данные)

0

У меня есть таблица со следующей структурой,

    'trading_daily_price' (
    'id' int(11) NOT NULL PRAMARY AUTO_INCREMENT,
    'date' date DEFAULT NULL,
    'Symbol' varchar(20) DEFAULT NULL,
    'Market' varchar(12) DEFAULT NULL,
    'QuoteName' text,
    'Price' float DEFAULT NULL,
    'PriceChange' float DEFAULT NULL,
    'PriceChangePct' float DEFAULT NULL,
    'Volume' float DEFAULT NULL,
    'DayLow' float DEFAULT NULL,
    'DayHigh' float DEFAULT NULL,
    'Week52Low' float DEFAULT NULL,
    'Week52High' float DEFAULT NULL,
    'Open' float DEFAULT NULL,
    'High' float DEFAULT NULL,
    'Bid' float DEFAULT NULL,
    'BidSize' float DEFAULT NULL,
    'Beta' float DEFAULT NULL,
    'PrevClose' float DEFAULT NULL,
    'Low' float DEFAULT NULL,
    'Ask' float DEFAULT NULL,
    'AskSize' float DEFAULT NULL,
    'VWAP' float DEFAULT NULL,
    'Yield' float DEFAULT NULL,
    'Dividend' char(12) DEFAULT NULL,
    'DivFrequency' varchar(24) DEFAULT NULL,
    'SharesOut' float DEFAULT NULL,
    'PERatio' float DEFAULT NULL,
    'EPS' float DEFAULT NULL,
    'ExDivDate' date DEFAULT NULL,
    'MarketCap' float DEFAULT NULL,
    'PBRatio' float DEFAULT NULL,
    'Exchange' varchar(32) DEFAULT NULL,
    'NewsTitle' varchar(1024) DEFAULT NULL,
    'NewsSource' varchar(32) DEFAULT NULL,
    'NewsPublicationDate' date DEFAULT NULL,
    'NewsURL' varchar(256) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Я не нашел идеи сломать его, во внешнем представлении мне нужны все эти столбцы для отображения. Я пишу запрос вроде,

    SELECT * FROM trading_daily_price WHERE date='SOME_DATE' AND Symbol='%search_key%' ORDER BY 'column' LIMIT 10

Таблица содержит миллионы записей, и каждый день добавляются новые записи. Теперь проблема заключается в том, что каждый запрос требует столько времени, чтобы генерировать результат. В 4 ГБ VPS с DigitalOcean с некоторой конфигурацией он работает хорошо. Но в Ходадди бизнес-хостинг работает очень медленно.

Я хочу знать, лучше ли разбить столбцы на несколько таблиц и использовать операторы JOIN. Увеличит ли производительность? или мне нужно следовать другой логике оптимизации.

Как предложил Мадхур, я добавил INDEX на сегодняшний день, символ и рынок. Он улучшает указанную выше скорость запроса, но следующий запрос все еще занимает много времени.

    SELECT 'date','Price' FROM trading_daily_price WHERE 'Symbol' = 'GNCP:US' ORDER BY date ASC

Заранее спасибо, Раджиб

  • 2
    Примените индексирование к столбцам даты, символа и столбца.
  • 0
    Большое спасибо, скорость действительно увеличилась, но все же, у меня есть вопрос, предлагается ли разбивать таблицу или нет?
Показать ещё 2 комментария
Теги:
query-optimization
stock-data

3 ответа

1

Как предположил Мадхур и Дж. Невилл, я нашел единственное решение - создать несколько INDEX по мере необходимости.

для первого SQL,

    SELECT * FROM trading_daily_price WHERE date='SOME_DATE' AND Symbol='%search_key%' ORDER BY 'column' LIMIT 10

нам нужно создать индекс, как показано ниже,

    CREATE INDEX index_DCS ON trading_daily_price ('date',column, symbol); 

и для второго SQL,

    SELECT 'date','Price' FROM trading_daily_price WHERE 'Symbol' = 'GNCP:US' ORDER BY date ASC

нам нужно создать индекс, как показано ниже,

    CREATE INDEX index_DPS ON trading_daily_price ('date',Price, symbol); 

Спасибо

0

Разделите эту таблицу.

Одна таблица имеет открытый/высокий/низкий/закрытый/объем, индексированный по запасам и дате.

Другая таблица содержит статическую информацию о каждом запасе.

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

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

0

Вам не нужен индекс даты, символа и столбца для вашего первого запроса, потому что вы ищете символ% text%, а MySql может использовать только часть даты индекса. Индекс с датой и столбцом должен быть лучше, потому что MySQL может использовать два столбца из индекса

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню