3.消除对大型表行数据的顺序存取 在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。 还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序 *** 作: SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008 虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句: SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECT * FROM orders WHERE order_num=1008 这样就能利用索引路径处理查询。 4.避免相关子查询 一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。 5.避免困难的正规表达式 MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” 即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。 另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。 6.使用临时表加速查询 把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序 *** 作,而且在其他方面还能简化优化器的工作。例如: SELECT custname,rcvblesbalance,……other columns FROM cust,rcvbles WHERE custcustomer_id = rcvlbescustomer_id AND rcvbllsbalance>0 AND custpostcode>“98000” ORDER BY custname 如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序: SELECT custname,rcvblesbalance,……other columns FROM cust,rcvbles WHERE custcustomer_id = rcvlbescustomer_id AND rcvbllsbalance>0 ORDER BY custname INTO TEMP cust_with_balance 然后以下面的方式在临时表中查询: SELECT * FROM cust_with_balance WHERE postcode>“98000” 临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。 注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。 7.用排序来取代非顺序存取 非顺序磁盘存取是最慢的 *** 作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。 有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。 实例分析 下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括3个表,模式如下所示: 1.part表 零件号牐牐牐牐犃慵描述牐牐牐牐牐牐牐犉渌列(part_num)牐╬art_desc)牐牐牐牐牐牐╫ther column) 102,032牐牐毁eageat 30G disk牐牐牐牐…… 500,049牐牐灿ovel 10M network card牐………… 2.vendor表 厂商号牐牐牐牐牐牫商名牐牐牐牐牐犉渌列(vendor _num)牐╲endor_name) (other column) 910,257牐牐牐牐毁eageat Corp牐牐…………
解决方案:
1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以尽可能使网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,无法全部手动去挨个实现,于是出现了常见的信息发布系统CMS,像常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。
2、服务器分离
对于Web服务器来说,不管是Apache、IIS还是其他容器,是最消耗资源的,于是有必要将与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的服务器,甚至很多台服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为问题而崩溃,在应用服务器和服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。 这一实现起来是比较容易的一现,如果服务器集群 *** 作起来更方便,如果是独立的服务器,新手可能出现上传只能在服务器本地的情况下,可以在令一台服务器设置的IIS采用网络路径来实现服务器,即不用改变程序,又能提高性能,但对于服务器本身的IO处理性能是没有任何的改变。
3、数据库集群和库表散列
大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是需要使用数据库集群或者库表散列。
4、缓存
缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,net不是很熟悉,相信也肯定有。
你的数据库是什么数据库?如果是ACCESS,建议你导入到MySQL中去,MySQL据说是世界上执行速度最快的数据库了,如果是MSSQL,请使用存储过程执行查询,可以大提高数据库的运行速度。你的问题我曾经碰到过,当时我使用的是ACCESS数据库,数据库中的数据达到20万条记录了,查询起来速度特慢,后来改用MSSQL的存储过程,速度提高了很多,你试试吧,祝你成功!
以上就是关于大批量的数据应当怎样进行数据库的优化全部的内容,包括:大批量的数据应当怎样进行数据库的优化、需要处理的数据量太大怎么处理、如何解决数据库表中大量数据的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)