У меня есть таблица со следующей структурой,
'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
Заранее спасибо, Раджиб
Как предположил Мадхур и Дж. Невилл, я нашел единственное решение - создать несколько 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);
Спасибо
Разделите эту таблицу.
Одна таблица имеет открытый/высокий/низкий/закрытый/объем, индексированный по запасам и дате.
Другая таблица содержит статическую информацию о каждом запасе.
Возможно, у другой есть статистика, полученная из необработанных данных.
Внесите такие изменения, а затем вернитесь для получения дополнительных советов/злоупотреблений.
Вам не нужен индекс даты, символа и столбца для вашего первого запроса, потому что вы ищете символ% text%, а MySql может использовать только часть даты индекса. Индекс с датой и столбцом должен быть лучше, потому что MySQL может использовать два столбца из индекса
Для вашего нового запроса вам понадобится индекс по символу, дате и цене. По этому индексу ваш запрос не потребуется возвращать в кластерный индекс для данных.
Разделение таблицы зависит от вашего варианта использования: как вы будете обрабатывать старые данные. Если старые данные не будут часто доступны, вы можете рассмотреть возможность разделения. Но ваше приложение нуждается в этом.