Я хранил всю транзакцию по сделке каждого торгового дня в таблице. Таблица содержит миллионы строк. Поскольку в то же время и во втором случае может произойти 2 или более транзакций, а исходные данные также не имеют первичного ключа. поэтому я не добавил первичный ключ к таблице. Но выполнение любого запроса происходит очень медленно, около 60 - 120 секунд.Как ускорить скорость запросов SQL
Вот структура: MySQL, InnoDB, utf8_general_ci
Ticker varchar(15)
ReleaseDT datetime
Order int(1)
Price decimal (7,3)
Volume bigint(13)
Amount bigint(13)
NoOfLot int(11)
Session varchar(3)
Source varchar(15)
TimeStamp timestamp
функция:
- получить каждый объем тикер по цене в день или в течение определенного периода времени.
- , чтобы узнать, сколько всего общей суммы покупки и общей продажи тикера каждый день
- далее по пункту 2, я разделить его на утреннюю общую сумму покупки и утро.
Вопрос: 1. Поскольку нет уникального элемента, который я мог бы найти, не будет ли первичный ключ для этой таблицы влиять на скорость запроса?
Должен ли я просто добавить auto_incremental # like ID, и он создает себя? помогает ли она в скорости запросов?
Некоторые запросы, которые мне нужны 60-120 секунд, чтобы улучшить приведенную выше таблицу? как индекс? если да, то пожалуйста сообщите как.
Я буду использовать php для веб-запроса и вывода, а иногда и vb.net для запроса с сервера mysql.
пример:
select Ticker, ReleaseDT as 'Last Update',Price, convert(sum(case when iOrder = 1 then Amount else 0 end),decimal(9,0)) as TtlBuyAmt,
convert(sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as TTlSellAmt,
convert(sum(case when iOrder = 0 then Amount else 0 end),decimal(9,0)) as TTlUndetAmt,
convert(sum(case when iOrder = 1 then Amount else 0 end)/sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as TTlBuySellRatio,
sum(case when iOrder = 1 and Session = 'AM' then Amount else 0 end) as BuyAmtAM ,
SUM(CASE WHEN iOrder = 1 and Session = 'PM' then Amount else 0 end) as BuyAmtPM ,
SUM(CASE WHEN iOrder = -1 and Session = 'AM' then Amount else 0 end) as SellAmtAM,
SUM(CASE WHEN iOrder = -1 and Session = 'PM' then Amount else 0 end) as SellAmtPM ,
convert(SUM(CASE WHEN iOrder = -1 and Session = 'PM' then Amount else 0 end)/SUM(CASE WHEN iOrder = -1 and Session = 'AM' then Amount else 0 end),decimal(5,2)) as SellPMAMRatio,
sum(Amount) as TotalAmt,
convert(sum(case when iOrder = 1 then Amount else 0 end) - sum(case when iOrder = -1 then Amount else 0 end),decimal(9,0)) as NetAmount
FROM Trade
WHERE Ticker = '1 HK EQUITY' and DATE(ReleaseDT) between '20150102' and '20150104'
GROUP BY Ticker, date(ReleaseDT), Price
ORDER BY Ticker ASC, Price DESC
Это занимает> 60secs бежать, любой способ улучшить?
SELECT * FROM AS2046.BlockTrade_EOD where Ticker = '1 HK EQUITY' and Date(ReleaseDT) > '20150102' Group by Price
с помощью EXPLAIN ... и результаты следующим образом:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'BlockTrade_EOD', 'ALL', NULL, NULL, NULL, NULL, '2327212', 'Using where; Using temporary; Using filesort'
Пожалуйста, сделайте 'EXPLAIN SELECT [...]' своим запросом и опубликуйте результат в своем вопросе. Также, пожалуйста, отправьте полное 'CREATE TABLE' -statement из соответствующих таблиц. – Bjoern
Добро пожаловать в Переполнение стека. Несомненно, что индексы помогут вашим запросам в этой таблице. Для нас, чтобы помочь вам, нам нужно увидеть некоторые из медленных запросов. Измените свой вопрос, чтобы включить их.В то же время читайте о ** составных индексах покрытия, **. –
. Это один из часто используемых sql-запросов. – Trader