mysql,有一张表里面已经有几千万条数据了,网页访问时极其缓慢,如何提高检索速度?

部分字段已经加了索引。
已经累计了8个月的数据了,今天把前面的数据都清掉了(用sql的delete语句删掉的),只保留了后三个月的数据,但是貌似网页检索速度没啥变化,为什么??有何解决办法??
拜托各位了,解决问题后追加翻倍分数!!!

注:页面只显示几个数值,这些是调用存储过程计算出来的。存储过程检索当天的数据做一些计算,然后返回给页面。

一般查询的话应该有常用的语句的。
比如常见查询为:
select * from factdata where user='a' and module='b' and dtime between '2012-11-01 00:10:00' and '2012-11-01 00:11:10';

那么你这时候需要在factdata表上建立(user,module,dtime)的联合索引。
alter table factdata add index i_merge(`user`,`module`,`dtime`);

你可以执行
explain select * from factdata where user='a' and module='b' and dtime between '2012-11-01 00:10:00' and '2012-11-01 00:11:10';
查看建立索引前面的返回的结果。

假如没有索引的话,explain会显示返回查询全表的数据自然会很慢了。
假如用到了索引的话,可以快速的找到需要查询的区间里的数据,往往需要查询的数据量是全表的1/100,1/1000,那么这时候花费的时间就是1/100,1/1000了。追问

我只是用 mysql-front 软件,把一些用到的字段设置成了索引,并没有建立联合索引。联合索引与单独的为某列设置索引有啥优劣???
还望赐教,谢谢!

页面显示的只是计算结果,只是几个数值,通过存储过程计算得到的结果,然后显示在页面上。
现在数据量越来越大了,问题就凸显了。
通过删除老旧数据,只保留了最近两个月的,居然没效果,非常奇怪,你认为是为什么呢?

追答

好像单独的索引的话,只会用到单一的索引;而一个表上有多个单一索引的话,也只会选取其中最有效果的一个;而联合索引的话,可以更加精确。
比如:
select * from factdata where user='a' and module='b' and dtime between '2012-11-01 00:10:00' and '2012-11-01 00:11:10';

假如只有一个user的索引的话,可能索引之后的记录数还是很多;但是user,module,dtime的组合索引的话,查找的结果会更少;当然要试你的查询情况而定。
另外你还需要确定是你的查询慢,还是你的存储过程慢,有可能你只保留最近两个月的数据已经比较快了,但是因为你的存储过程慢,所以实际还是比较慢。你可以将存储过程里面的查询单独拿出来跑一下看看花费的时间。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-22
加索引,还有分页检索,sql 当初写的有问题,你不可能一次性全部都查出来扔给前台吧,那不是扯淡吗,啥页面也不可能一次性查看几千万啊,分页查询吧。只能从sql语句上更改追问

页面显示的只是计算结果,只是几个数值,通过存储过程计算得到的结果,然后显示在页面上,所以不存在分页显示的问题。
刚开始的时候这个问题不突出,现在数据量越来越大了,问题就凸显了。
通过删除老旧数据,只保留了最近两个月的,居然没效果,非常奇怪,你认为是为什么呢?

追答

PLSQL里面 统计写的有问题吧,不可能会有那么大延迟,几千万数据量 也不是非常大。
方便的话把你存储过程里面统计的发出来看看,做统计 就更不可能 反应慢了

追问

代码太长,请查私信,谢谢!

追答

我看了 代码,没有看出问题,问题应该不是在存储过程上面,恕无能为力了

追问

还是得感谢你,我继续等待有人来解决问题
先谢谢了!

第2个回答  2012-11-22
把语句贴出来看看
第3个回答  2012-11-22
加索引试试,一下是索引创建的规则:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。追问

页面显示的只是计算结果,只是几个数值,通过存储过程计算得到的结果,然后显示在页面上。
现在数据量越来越大了,问题就凸显了。
通过删除老旧数据,只保留了最近两个月的,居然没效果,非常奇怪,你认为是为什么呢?

相似回答