表结构和数据大体如下;
id userid title num_click updated
1 11 文章1 100 1272519012
2 12 文章2 200 1272519012
3 13 文章3 300 1272519012
4 13 文章4 400 1272519012其中数据量是十万级别的。我想读出点击量前十的文章标题和内容如:select title,num_click,content from article order by num_click limit 10;但是我给num_click加了索引仍然是全表扫描
解决方案 »
- Error: log file .\ib_logfile0 is of different size 0 56623104 bytes
- 谁那里有mysql教程啊
- 如何用一条语句drop掉所有aa为前缀的表
- 使用Navicat清空Mysql表后 id自增不能从1开始
- 关于服务器系统更新重启后PostgreSQL8.1服务无法启动
- 谁推荐几分有“数据库设计”和“c/s通信”这方面内容比较多一点的报纸!
- 怎么得到某字段最大的记录.在线等待,当场结分.
- 多表连接查询如何查(一个真实的业务需求)
- 为什么执行这个动作就死机了 效率问题 如何解决
- Linux C实现从MySQL中读取并处理数据
- mysql 时间判断删除数据
- 怎么在查询中创建一个自增ID字段
我没有建索引,因为我怎么建索引,他都是全表扫描下边是我的具体的表
CREATE TABLE IF NOT EXISTS `article` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id号',
`userid` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '发起人id号',
`title` varchar(150) NOT NULL COMMENT '话题标题',
`num_click` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '点击数',
`content` text NOT NULL COMMENT '内容',
`updated` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='文章表' AUTO_INCREMENT=561700 这事explain
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE article ALL NULL NULL NULL NULL 2 Using filesort
不过过程比较奇怪,一开始explain也没有索引,后来加了个WHERE num_click > 0,就索引了。
怀疑是不是cache的问题。
explain SELECT SQL_NO_CACHE ...BTW order by num_click DESC
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+------+-------+
| 1 | SIMPLE | article | index | NULL | Index_2 | 2 | NULL | 10 | |
+----+-------------+---------+-------+---------------+---------+---------+------+------+-------+
加了个WHERE num_click > 0会用索引,但是还会全表扫描的,因为所有的记录的num_click 都大于 0,还是不能优化这个sql语句
select title,num_click,content from article order by num_click DESC limit 10;
我的数据库也造了十几万条记录,content里面也有内容,不过比较断短而已。
1 SIMPLE article ALL NULL NULL NULL NULL 2 Using filesort
索引情况:Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
article 0 PRIMARY 1 id A 2 NULL NULL BTREE
article 1 num_click 1 num_click A 2 NULL NULL BTREE
ADD INDEX `num_click` (`num_click`,`id`);
explain select title,num_click,content from (select id from article order by num_click desc limit 10) as rs join article on rs.id=article.id order by num_click desc;
我插入了10万条数据,索引了下,就ok了,谢谢
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE article index NULL num_click 5 NULL 10