【发布时间】:2018-07-13 01:21:08
【问题描述】:
我正在尝试找出 mySQL 中关于索引的设置。 mySQL 什么时候忽略索引?
这是一个实验的结果。我有一个在 AGE 列上有索引的表,如下所示。
CREATE TABLE `USERS` (
`ID` int(11) NOT NULL,
`FIRSTNAME` varchar(45) NOT NULL,
`LASTNAME` varchar(45) DEFAULT NULL,
`USERNAME` varchar(45) DEFAULT NULL,
`ROLE` int(11) DEFAULT NULL,
`PASSWORD` varchar(45) DEFAULT NULL,
`AGE` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `USERS`
ADD PRIMARY KEY (`ID`),
ADD KEY `AGE` (`AGE`);
EXPLAIN 查询的结果。前三个语句使用索引。第二组语句忽略索引并进行全表扫描。
AGE 的范围是 20 到 100 年之间的随机值。表中有 1000 行。
/* utilizes the index on AGE */
/* case 1 */
SELECT ID, AGE FROM USERS WHERE AGE > 20;
/* case 2 */
SELECT AGE FROM USERS WHERE AGE > 44;
/* case 3 */
SELECT * FROM USERS WHERE AGE > 84;
/* does not use index on AGE */
/* case 4 */
SELECT AGE, FIRSTNAME FROM USERS WHERE AGE > 83;
/* case 5 */
SELECT * FROM USERS WHERE AGE > 83;
/* case 6 */
SELECT AGE FROM USERS WHERE AGE > 18;
我看到的一些观察结果。谁能证实我的结论是正确的?
1) SELECT * 将在选择 15% 或更少的行时使用索引。 2) SELECT AGE 将在选择 1 行或更多行时使用索引。
【问题讨论】:
-
使用格式化工具使您的帖子更具可读性。使用
code blocking表示代码、日志和错误文本,使用 bold 和 italics 突出显示内容 -
我认为这些都是针对同一张表进行测试的。案例 3 和案例 5 尤其令人费解。可能在禁用缓存的情况下重新测试(即 `SELECT SQL_NO_CACHE
)。
标签: mysql database select indexing