例如我想知道table1里是否有city='Beijing'的记录,该怎么写查询语句呢?
我知道可以写
select count(*) from table1 where city='Beijing'然后就可以看到有多少条记录了;
或者可以写
select * from table1 where city='Beijing'然后可以通过看返回的记录集是否为空来判断是否存在符合条件的记录。 可是现在的问题是,这个表会很大,例如几十万条记录甚至更多;city='Beijing'的记录也会有很多。通过上面的方法都会需要扫描整个表来得到结果,开销大,而我仅仅只是想知道是否存在city='Beijing'的记录而已,犯不着搞这样大的开销。 或者有人会回答这样的:
select * from table1 where city='Beijing' limit 1
这样强制让查询只返回一条记录。
可是这样也不行,Mysql还是会扫描整个表,因为它好像还会隐含的根据什么东西来进行排序,然后返回排序后的第一个记录。反正是,像上面那样写,用explain分析结果表明Mysql还是会扫描整个表的。 怎么办?求强人指教啊!说明一句:使用的数据库是Mysql,但是凡是能解决类似问题的方法都好呀!
我知道可以写
select count(*) from table1 where city='Beijing'然后就可以看到有多少条记录了;
或者可以写
select * from table1 where city='Beijing'然后可以通过看返回的记录集是否为空来判断是否存在符合条件的记录。 可是现在的问题是,这个表会很大,例如几十万条记录甚至更多;city='Beijing'的记录也会有很多。通过上面的方法都会需要扫描整个表来得到结果,开销大,而我仅仅只是想知道是否存在city='Beijing'的记录而已,犯不着搞这样大的开销。 或者有人会回答这样的:
select * from table1 where city='Beijing' limit 1
这样强制让查询只返回一条记录。
可是这样也不行,Mysql还是会扫描整个表,因为它好像还会隐含的根据什么东西来进行排序,然后返回排序后的第一个记录。反正是,像上面那样写,用explain分析结果表明Mysql还是会扫描整个表的。 怎么办?求强人指教啊!说明一句:使用的数据库是Mysql,但是凡是能解决类似问题的方法都好呀!
解决方案 »
- 大家都用什么数据库设计软件?
- Mysql绿色版有多大?
- 数据二进制存储问题
- 为什么这样写 myReader.()总是只能执行一次查询,第二次myReader.()返回的总是FAULSE
- Linux下安装Mysql后,用windows2000连接不上,why?急急急急急急急急急急急急急急急急急急急急急急!
- error1045
- 求判断存储过程这么写是否正确.
- mysql存储过程 双层游标嵌套循环
- My SQL 安装不成功,求高手指导!!!
- 2张表的结构不一样字段也不一样,我要同步2个表的数据怎么做,通过定时器来实现。
- 怎么写个SQL,复制一张表成另一个新表。(最好SQlite能用)
- 安装MYSQL,最后一步(apply security settings)出错,急救答案中.
难道像这样的情形只能从其他方面考虑了吗?例如分表或者其他的?单纯从sql查询方面没有好办法了?
-----------------------------------Table Create Table
------ ----------------------------------------------------------------------------------------
song CREATE TABLE `song` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Autoincreament element',
`name` char(200) DEFAULT NULL,
`datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`rank` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `k_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=8102001 DEFAULT CHARSET=gbk select count(*) from song;
explain select count(1) from song where `name` = 't1';
count(*)
8102000
query result(1 records)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE song ref k_name k_name 401 const 2 Using where; Using index 我这个里面只是扫描了两行而已,虽然表有八百多行。
可是用explain还是显示要扫描4个记录啊,并不是就能够省下很多了。
mysql> explain select count(1) from song where name='aaa';
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+
| 1 | SIMPLE | song | ref | k_name | k_name | 401 | const | 4 | Using where; Using index |
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+那么name为aaa的记录如果有10万条,还不是得扫描99999条记录?难道跟mysql版本有关系?我的是5.0.27版本的。