-
ORACLE数据库效率问题
2017-07-28 08:49:25对oracle数据库来讲多个客户端同时向数据库服务器插入数据快还是由一个客户端统一向数据库插入数据快。 -
Scrapy+adbapi提高数据库效率
2019-11-17 16:49:25一:twisted中的adbapi 数据库pymysql的commit()和execute()在...如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。 使用twisted异步IO框架,实现数据的异步写入,通过多线程异步的形式对数据...一:twisted中的adbapi
数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
使用twisted异步IO框架,实现数据的异步写入,通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。1.1 两个主要方法
adbapi.ConnectionPool:
创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,再其内部依然使MySQLdb这样的库访问数据库。
dbpool.runInteraction(do_insert,item):
异步调用do_insert函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给do_insert的第二个参数,传给do_insert的第一个参数是一个Transaction对象,其接口与Cursor对象类似,可以调用execute方法执行SQL语句,do_insert执行后,连接对象会自动调用commit方法
1.2 使用实例
from twisted.enterprise import adbapi
# 初始化数据库连接池(线程池) # 参数一:mysql的驱动 # 参数二:连接mysql的配置信息 dbpool = adbapi.ConnectionPool('pymysql', **params)
# 参数1:在异步任务中要执行的函数insert_db; # 参数2:给该函数insert_db传递的参数 query = self.dbpool.runInteraction(self.do_insert, item)
# 在execute()之后,不需要再进行commit(),连接池内部会进行提交的操作。 def do_insert(self, cursor, item): insert_sql = """ insert into qa_sample( need_id, need_question_uptime, need_title, need_title_describe, need_answer_uptime, need_answer) values (%s, %s, %s, %s, %s, %s) """ params = (item['need_id'], item['need_question_uptime'], item['need_title'], item['need_title_describe'], item['need_answer_uptime'], item['need_answer']) cursor.execute(insert_sql, params)
二:结合scrapy中的pipelines
# -*- coding: utf-8 -*- from twisted.enterprise import adbapi import pymysql # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html class QaSpiderPipeline(object): def process_item(self, item, spider): return item class MysqlTwistedPipeline(object): def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_settings(cls, settings): dbparams = dict( host=settings['MYSQL_HOST'], db=settings['MYSQL_DBNAME'], user=settings['MYSQL_USER'], passwd=settings['MYSQL_PASSWORD'], charset='utf8', cursorclass=pymysql.cursors.DictCursor, use_unicode=True ) dbpool = adbapi.ConnectionPool('pymysql', **dbparams) return cls(dbpool) def process_item(self, item, spider): query = self.dbpool.runInteraction(self.do_insert, item) def do_insert(self, cursor, item): insert_sql = """ insert into qa_sample( need_id, need_question_uptime, need_title, need_title_describe, need_answer_uptime, need_answer) values (%s, %s, %s, %s, %s, %s) """ params = (item['need_id'], item['need_question_uptime'], item['need_title'], item['need_title_describe'], item['need_answer_uptime'], item['need_answer']) cursor.execute(insert_sql, params)
-
使用adbapi提高访问数据库效率
2018-07-25 11:17:24在某些爬虫项目下,我们需要每次执行一条插入语句,就立即调用commit方法更新数据库,...这里就可以使用Twisted中提供的以异步方式多线程访问数据库的模块adbapi,可以显著提供程序访问数据库的效率。 adbapi.Conne...在某些爬虫项目下,我们需要每次执行一条插入语句,就立即调用commit方法更新数据库,如果爬取时间太长,中途可能被迫中断,这样程序就不能执行close_spider中的commit。但如果在insert_db中直接加入commit,又会使程序执行变得很慢。这里就可以使用Twisted中提供的以异步方式多线程访问数据库的模块adbapi,可以显著提供程序访问数据库的效率。
- adbapi.ConnectionPool方法可以创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,再其内部依然使MySQLdb这样的库访问数据库。
- dbpool.runInteraction(insert_db,item)以异步方式调用insert_db函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给insert_db的第二个参数,传给insert_db的第一个参数是一个Transaction对象,其借口与Cursor对象类似,可以调用execute方法执行SQL语句,insert_db执行后,连接对象会自动调用commit方法
from twisted.enterprise import adbapi class MysqlAsyncPipeline(object): def open_spider(self, spider): ... self.dbpool = adbapi.ConnectionPool('MySQLdb', host=host, db=db, user=user, passwd=passwd, charset='utf8') def close_spider(self, spider): self.dbpool.close() def process_item(self, item, spider): self.dbpool.runInteraction(self.insert_db, item) return item def insert_db(self, tx, item): values = ( item['name'], item['price'], ... ) sql = 'INSERT INTO books VALUES (%s, %s, %s, %s, %s, %s)' tx.execute(sql ,values)
-
提高数据库效率的方法
2015-05-19 15:11:091.采用连接池技术,可以很...2.正确使用SQL批处理以及事务控制,优化大量SQL执行的效率。 3.使用合适的缓存技术。 4.结合数据库特性以及实际数据情况优化SQL语句,例如数据库表增加索引、使用数据库内置的函数等等。1.采用连接池技术,可以很大程度上提高数据库连接的利用率,避免频繁创建、销毁数据库连接带来的性能影响。
2.正确使用SQL批处理以及事务控制,优化大量SQL执行的效率。
3.使用合适的缓存技术。
4.结合数据库特性以及实际数据情况优化SQL语句,例如数据库表增加索引、使用数据库内置的函数等等。 -
C#访问SQLLite数据库效率低下的问题
2019-06-26 19:07:10昨天在将一个项目的数据库从SQL Server 2005改成访问SQLLite数据库时,发现数据库的读写速度变得出奇的慢啊,原来在SQL Server 2005中进行的一个事务处理可能1S就完成了,而在改成访问SQLLite后则需要5,6S实在是...昨天在将一个项目的数据库从SQL Server 2005改成访问SQLLite数据库时,发现数据库的读写速度变得出奇的慢啊,原来在SQL Server 2005中进行的一个事务处理可能1S就完成了,而在改成访问SQLLite后则需要5,6S实在是无法接受啊。可是在SQLLite中的数据库结构和SQLServer中的一样啊,只是将访问SQL Server 2005的数据库访问层进行了小许的改动而已啊。所有的数据库访问语句也很简单啊,数据库的表结构也很简单,一般一个表也就10个字段左右,目前数据库的数据量也不大,就几百条数据而已,我们做的操作也就是查询,插入,删除而已,而且尽量优化了SQL的使用,一般也就是单表操作,而且也避免了使用select * from 这种检索,表连接也是都使用inner join。感觉比较奇怪,原因调查中,也请各位大侠帮忙指点下。转载于:https://www.cnblogs.com/kevinGao/archive/2012/06/18/2555415.html
-
php读取文本和读取数据库效率对比过程+结论
2020-02-10 10:13:49读写txt文件与读写数据库哪个更快?解决办法 今天 突然遇到这个问题,在网上找了很久才找到的一篇文章,所以转来了,其实这个问题开始是有些模糊,但仔细想一下还是能猜出一个大概,所以有时候,人的意识可能也很... -
关联表的数据库效率问题
2015-12-18 10:19:59关联表的检索效率 -
数据库非活跃用户超多,影响数据库效率解决方案
2015-11-12 12:08:14一定时间内,不活跃用户,分开独立表格,锁定 当登录时候,判断是否是非活跃用户,如果是,提示激活流程,然后转到活跃用户表格。...这样常用查询的时候,都是针对一定时间内的活跃用户,大大提高了效率 -
JAVA遍历时判断验证查询数据库效率太慢问题解决
2019-06-03 19:01:27在遍历列表时需要验证数据的正确性,每遍历一次就要根据name查询数据库数据效率很慢,代码如下: //获得第一个表单的迭代器 Iterator<org.apache.poi.ss.usermodel.Row> rows = sheet.rowIterator(); // ... -
提升数据库效率(一)
2015-10-08 16:28:58但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低... -
Statement批量执行sql语句,批量操作数据库,提高数据库效率
2014-03-14 22:34:25例如有一个ArrayList al = new ArrayList...在执行前面的得到数据库连接之后,执行如下操作: Statement st = ct.createStatement(); for(int i=0;i User u=(User)al.get(i); sm.addBatch("insert into user values('"+ -
索引也会影响数据库效率
2010-02-18 18:55:00数据库的效率变低,最后查找是因为一个insert 语句执行的慢而导致的。 将需要insert的表上的索引删除,则问题解决。 所以,建立索引也需要三思,要考虑周全。 不过,索引删除后,又会使select的执行变慢,矛盾啊... -
使用数据库效率是不是太低了?
2016-06-15 19:15:33但听说,服务端的程序,用户信息应该保存在数据库里,象mysql这样的数据库里。 我试着作了转换,马上发现,用mysql比用C语言自己的结构数组要麻烦多了。它是“查询语言”。比如,它要改变一个数据,要用什么... -
使用c/c++编程插入MySQL数据库效率底下的解决方案
2014-07-11 14:20:40在最近编程对MySQL数据库进行插入的时候发现效率非常的低,实验环境是在 -
mysql数据库效率。100万条数据--500万条数据
2016-09-28 16:03:08一般的应用系统,读写... 1 数据库表建立索引默认规则: (1)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果... -
海量数据插入数据库效率对比测试 ---ADO.NET下SqlBulkCopy()对比LINQ 下InsertAllOnSubmit()
2014-11-07 10:48:07摘要:使用.NET相关技术向数据库中插入海量数据是常用操作。本文对比ADO.NET和LINQ两种技术,分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:相同插入工作量(1w条数据)插入效率相差200倍之巨... -
数据库效率 in是把外部和内表进行hash连接 exists是对外表做loop循环,然后每次loop循环再对内部进行查询
2011-05-11 09:26:00如果两个表一个较小一个较大。则子查询大表的用exists,子查询表小的用in...效率低,用到了A上的CC列索引SQL codeSELECT*FROM A WHEREEXISTS (SELECT CC FROM B WHERE CC = A.CC) <br /> 效率高,用到了B表 -
怎样提高数据库查询效率
2019-05-13 09:50:03目前可以说大多数程序的所耗的时间大部分在于数据库查询中。...SQL语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器的60%~90%的资源,大部分数据库的效率... -
数据库查询效率
2012-12-06 17:24:16详细讲解提高数据库查询效率的实用方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎... -
『数据库』数据库系统效率Max--数据库并发控制
2020-06-12 22:27:58多用户数据库系统2.多事务执行方式2.1 事务串行执行2.2 交叉并发方式(Interleaved Concurrency)2.3同时并发方式(simultaneous concurrency)2.4 事务并发执行带来的问题1 并发控制概述1.1修改丢失1.2 不可重复读... -
提高数据库插入效率
2015-12-03 14:40:04插入数据,是MySQL数据库的基本任务。...此时数据库管理员就需要采取措施来提高数据插入的效率。针对这块内容,笔者认为数据库工程师在应用程序与数据库设计时,需要注意如下几个细节问题。 细节 -
oracle数据库select效率
2015-10-09 03:03:25前提:数据库有将近100W条数据。 目的:需要排序后获取前10条。 处理:select * from (select * from table where col1=1 order by col1) where rownum ; 问题:如上的sql语句,如果数据少的话,可以达到要求;但是... -
如何从数据库设计方面提高数据库查询效率
2018-02-26 23:50:13可以从以下多个方面优化数据库设计提高数据库查询效率a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将... -
提高数据库检索效率
2019-10-20 03:07:14数据检索速度慢的原因: 1、没有索引或者没有用到索引 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 ...索引是数据库中重要的数据结构,它的根本目的就... -
数据库查询效率的问题
2018-03-17 15:36:23然后在后台查询数据库(MongoDB)的时候就嵌套了三层数据库的查询(一个查询阅读,一个查询评论,一个查询文章)。我感觉这种查询方式在数据多了过后效率应该会特别低。但是我不知道该设计这种查询。 -
如何提高数据库读写效率
2019-02-23 19:35:40可以从以下多个方面优化数据库设计提高数据库查询效率 a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则...