如何优化大型mysql表(股票数据)

pcww981p  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(345)

我有一张table,结构如下,

`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

该表有数百万条记录,每天都会添加新的记录。现在的问题是,每个查询都需要花费大量的时间来生成输出。在带有digitalocean和一些配置的4gb vps中,它运行得很好。但是,在godaddy的业务中,它运行得非常慢。
我想知道将列拆分为多个表,并使用join语句是否更好。它会提高性能吗?或者我需要遵循其他优化逻辑。
正如madhur所建议的,我已经添加了日期、符号和市场的索引。它提高了上面的查询速度,但是下面的查询仍然需要很多时间。

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

提前谢谢,拉吉布

bweufnob

bweufnob1#

第一次查询不需要日期、符号和列索引,因为您正在按%text%搜索符号,mysql只能使用索引的日期部分。带有日期和列的索引应该更好,因为mysql可以使用索引中的两列
对于您的新查询,您将需要关于符号、日期和价格的索引。通过这个索引,您的查询将不需要返回到数据的聚集索引。
是否拆分表取决于您的用例:您将如何处理旧数据。如果不经常访问旧数据,可以考虑拆分。但你的应用程序需要迎合它。

kfgdxczn

kfgdxczn2#

把那张table分开。
一个表有打开/高/低/关闭/数量,按股票和日期索引。
另一个表提供了关于每个股票的静态信息。
也许另一个有来自原始数据的统计数据。
做出这样的改变,然后回来寻求更多的建议/辱骂。

o2g1uqev

o2g1uqev3#

正如madhur和jnevill所建议的,我发现唯一的解决方案是根据需要创建多个索引。
对于第一个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);

谢谢

相关问题