Mysql 我应该如何选择应该索引的列以减少数据搜索?

Mysql 我应该如何选择应该索引的列以减少数据搜索?,mysql,indexing,mariadb,Mysql,Indexing,Mariadb,我有一个如下的表格,大约有300万行数据,我需要在这个表格中按日期和股票代码进行搜索,但我对这些列是否索引感到困惑。我测试了不同的索引组合,但找不到更好的状态 问题2: 我如何知道应该索引哪一列 索引对插入和更新查询有什么影响 表: CREATE TABLE `_b_price` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `tickerDate` varchar(100) NOT NULL, `ticker` varchar(50) D

我有一个如下的表格,大约有300万行数据,我需要在这个表格中按日期和股票代码进行搜索,但我对这些列是否索引感到困惑。我测试了不同的索引组合,但找不到更好的状态

问题2:

  • 我如何知道应该索引哪一列
  • 索引对插入和更新查询有什么影响
表:

CREATE TABLE `_b_price` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `tickerDate` varchar(100) NOT NULL,
  `ticker` varchar(50) DEFAULT NULL,
  `date` DATE DEFAULT NULL,
  `close` int(11) DEFAULT NULL,
  `high` int(11) DEFAULT NULL,
  `low` int(11) DEFAULT NULL,
  `numOfTrades` int(11) DEFAULT NULL,
  `open` int(11) DEFAULT NULL,
  `value` bigint(20) DEFAULT NULL,
  `volume` int(11) DEFAULT NULL,
  `vwap` int(11) DEFAULT NULL,
  `state` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tickerDate` (`tickerDate`),
  KEY `date` (`date`),
  KEY `ticker` (`ticker`)
) ENGINE=InnoDB AUTO_INCREMENT=2667983 DEFAULT CHARSET=utf8

人们只能通过查看模式来猜测索引。我们需要查看查询来判断要使用哪些索引。“按日期和股票代码搜索”太模糊

但是,既然我已经处理过这样的表格,我可以给你一些提示:

  • 索引的卷可以超过INT的大小
  • 价格是不可分割的
  • tickerDate不应该是
    日期
    数据类型吗
  • 投掷
    id
    ,除非你有特殊用途。将
    唯一
    提升为
    主键
  • 等等!你每天只允许一排,你有几百万?也许“tickerDate”用词不当
  • 主键
    可能应该是
    (股票代码,日期)
    。这样就不需要
    键(ticker)
  • 您可能还需要
    索引(日期)
    ——我需要看看你的问题
  • 我怀疑任何交易项目都有ascii“ticker”,所以不要使用
    CHARSET=utf8
  • 规范化标记,替换为(可能)未签名的
    MEDIUMINT
    (16M限制)
更多:

  • 我想你的意思是让
    UNIQUE(TickerDate)
    成为
    UNIQUE(Ticker,TickerDate)
    。(然后升级到PK,如上所述。)

@草莓:))好的,兄弟,我会改变我的日期,我是个新手,这是我的第一个问题,我改变了它并显示了create table我不知道tickerdate列是用来做什么的。在(date,ticker)(或者可能是(ticker,date))上建立一个指数(或者可能是一个唯一的指数)似乎是可取的——而不是那些单独的指数,你的提示对我来说非常有用,我会一个接一个地检查,每天我都有超过4000条记录,股票代码是股票的唯一代码。我添加了多一点。