欢迎投稿

今日深度:

mysql5.6.19下子查询无法使用索引的疑问,mysql5.6

mysql5.6.19下子查询无法使用索引的疑问,mysql5.6.19索引


表结构很简单

CREATE TABLE `oplogs` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `kind` varchar(45) NOT NULL DEFAULT '',
  `op` varchar(100) NOT NULL,
  `user` varchar(25) NOT NULL DEFAULT '',
  `ip` varchar(16) NOT NULL DEFAULT '',
  `updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=34896 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED

结果有34895条

sql查询语句为:

SELECT a.id,a.kind,a.op,a.user,a.ip,a.updatetime FROM oplogs as a inner join(select id from oplogs where 1  order by id desc limit 0,20) as b using(id)

在5.6.19情况下

用php读取内容并显示

首次显示结果需要3.5秒

但是同样的配置

在linux 下 5.5.38下

只需要0.7秒左右

很奇怪的情况

然后在5.6下执行了explain 结果如下:

而同样的数据 explain 结构如下:

比较结果很明显 主要在于对oplogs进行排序时,rows行变化太大了,一个进行了完整的遍历,第一个使用了索引,造成差距过大,不过原因尚未找到,有哪位知道呢?

 


MYSQL索引问题:索引在查询中怎使用?看了很多资料都只说索引的建立是否建立了就不用再理会?

假如你有一个表,

SQL> CREATE TABLE test_tab (
2 id INT,
3 name VARCHAR(10),
4 age INT,
5 val VARCHAR(10)
6 );

你的业务,有一个查询,是
SELECT * FROM test_tab WHERE name = 一个外部输入的数据

刚开始,数据不多的时候,执行效果还不错。
随着数据量的增加,这个查询,执行起来,越来越慢了。

然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
这样, 可以加快前面那个查询的速度。

但是,某天,你执行了下面这个SQL, 发现速度又慢了
SELECT * FROM test_tab WHERE age = 25
为啥呢? 因为 age 字段上面,没有索引
索引只在 name 上面有

换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。

多列索引,就是一个索引,包含了2个字段。

例如:
CREATE INDEX idx_test_name_age ON test_tab (name, age);

那么
SELECT * FROM test_tab
WHERE
name LIKE '张%'
AND age = 25
这样的查询,将能够使用上面的索引。

多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:

SELECT
AVG( avg ) AS 平均年龄
FROM
test_tab
WHERE
name LIKE '张%'

这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。
 

多表连接查询不可以使用索引

这里你需要建立几个索引(可能的话也建立外键):
1、a.fk1

2、c.fk

3、a.fk2

4、b.id 看这个 应该是主键 已经有了,所以不需要
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2570.html NewsArticle mysql5.6.19下子查询无法使用索引的疑问,mysql5.6.19索引 表结构很简单 CREATE TABLE `oplogs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `kind` varchar(45) NOT NULL DEFAULT '', `op` varchar(100) NOT NULL, `user` varc...
评论暂时关闭