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

标签 mysql query-optimization stock-data

我有一个具有以下结构的表格,

    `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 的建议,我已将 INDEX 添加到日期、代码和市场。它提高了上面的查询速度,但是下面的查询仍然需要很多时间。

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

提前致谢, 拉吉布

最佳答案

根据 Madhur 和 JNevill 的建议,我发现唯一的解决方案是根据需要创建多个 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); 

谢谢

关于mysql - 如何优化大型mysql表(股票数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51705236/

相关文章:

PHP脚本无法访问sql中的数据库

mysql - 测量实际的 MySQL 查询时间

mysql - 优化 MySql 查询(IN)以避免使用 “Using filesort”

sql - 调整 mysql 查询以获得更好的性能

python - ValueError : Error getting data from the api, 没有返回。阿尔法优势

PHP MySQL - where 相关子句不读取变量

java - 如果找到匹配,则中止后续的 UNION ALL 命令 [H2]

python - 将不同日期格式的txt导入MySQL

python - 无法使用python将数据加载到mysql中

mysql - 语法错误代码: 1064 in MYSQL statement