【问题标题】:simple select query optimise简单的选择查询优化
【发布时间】:2016-04-13 03:04:14
【问题描述】:

我有一个表定义如下:

   CREATE TABLE IF NOT EXISTS `cards` (
`ID` int(11) NOT NULL,
  `Name` varchar(200) NOT NULL,
  `WorkerID` varchar(20) NOT NULL,
  `pic` varchar(200) NOT NULL,
  `expDate` bigint(20) NOT NULL,
  `reminderSent` tinyint(4) NOT NULL,
  `regNum` varchar(8) NOT NULL,
  `cardType` varchar(200) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=92 DEFAULT CHARSET=latin1;


ALTER TABLE `cards`
 ADD PRIMARY KEY (`ID`), ADD KEY `cardsWorkerID_idx` (`WorkerID`);

但正在运行:

explain
SELECT pic, expDate, Name, ID, cardType, regNum FROM cards WHERE workerID= 18

告诉我它正在扫描整个表,即使我在 workerID 字段中添加了索引。谁能解释我错过了什么?

【问题讨论】:

  • workerid 真的应该是 INT 似乎是合理的!此外,此表定义似乎不完整。
  • 该表“不计算”——AUTO_INCREMENT 列在哪里?
  • workerID=18 的行的百分比是多少?如果超过 20% 左右,优化器将决定扫描表比使用索引更快。
  • @Strawberry 最初的 workerID 是 INT,但现在客户希望使用他们自己的字母数字标识符,而这些标识符来自以前的系统。它始终是唯一的,这就是为什么它被更改为 varchar 但问题中的 workerID 为 18 是在开发开始时设置的测试帐户
  • @RickJames 请参阅上面的评论,因为省略了自动增量 col。目前表格很小,因为我们仍处于开发阶段。任何用户都可以根据需要添加任意数量的列,但一般来说,在字段中使用时,任何用户都不应拥有超过 20% 的表格

标签: mysql sql select query-optimization


【解决方案1】:

索引的使用取决于数据的大小。它还取决于用于比较的类型。如果您有一个小表,那么 SQL 引擎可能会认为扫描比使用索引更有效。如果表格适合单个数据页,则尤其如此。

但是,在您的情况下,问题可能是数据转换。使用适当的类型常量进行比较:

SELECT pic, expDate, Name, ID, cardType, regNum
FROM cards
WHERE workerID = '18';

【讨论】:

  • 谢谢!我忽略了简单的引号!只要允许我就会接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多