CREATE TABLE 'key_t'
(
'id' int(11) NOT NULL auto_increment,
'key1' int(11) NOT NULL default '0',
'key2' int(11) NOT NULL default '0',
'key3' int(11) NOT NULL default '0',
PRIMARY KEY ('id'),
KEY 'normal_key' ('key1','key2','key3')
)ENGINE=InnoDB这个SQL在上面的表上执行,Where子句和Order by 子句是否都用到了normal_key索引?
select * from key_t where key1=1 order by key3
(
'id' int(11) NOT NULL auto_increment,
'key1' int(11) NOT NULL default '0',
'key2' int(11) NOT NULL default '0',
'key3' int(11) NOT NULL default '0',
PRIMARY KEY ('id'),
KEY 'normal_key' ('key1','key2','key3')
)ENGINE=InnoDB这个SQL在上面的表上执行,Where子句和Order by 子句是否都用到了normal_key索引?
select * from key_t where key1=1 order by key3
解决方案 »
- 求一个办法,可做到:1、一个表(如果需要拆分请说明)的数据,希望可以快速删除某一特定时段内的数据(大概30w-200w行)2、不影响或加快查询速度 3、好管理
- MYSQL的疑惑
- 用Mysql查询出A表中与掉B表相同的部分,并输出结果
- 数据库编码问题?
- 关于Mysql中的建数据库问题!!
- 问下日期算数中type的问题
- 急!我从mysql官方网上下载了mysql5.0.27-win32,安装到我机器上无法访问mysql服务器,报如下错!
- 远程备份的问题
- 超级菜鸟问题,在W2KS下安装完MYSQL以后,怎么启动啊,MYSQL有没有图形界面
- 语句错误,请帮忙指正一下 谢谢
- mysql的触发器的问题
- mysql 简单查询问题
mysql> explain select * from key_t where key1=1 order by key3;
+----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
| 1 | SIMPLE | key_t | ref | normal_key | normal_key | 4 | const | 1 | Using where; Using index; Using filesort |
+----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
1 row in set (0.03 sec)
因为你没有关于 key3 的索引。 只有一个 ('key1','key2','key3') ,这个索引并不适用。
假定你执行下面的SELECT语句:mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果col1和col2上存在一个多列索引,可以直接取出相应行。如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。如果列不构成索引最左面的前缀,MySQL不能使用局部索引。假定有下面显示的SELECT语句。
SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。