찾다

 >  Q&A  >  본문

python-mysqldb - 这样结构的mysql表,如何快速update

碰到一个类似这样的问题,请各位朋友帮助一下。
比如我的mysql数据表如下:

id key1 value1 key2 value2 key3 value3 key4 value4
1 0.138 0.513 西 0.961 0.756
2 0.962 0.258 0.625 0.533
3 西 0.628 0.268 0.156 0.697
4 0.628 0.894 0.625 西 0.268
... ... ... ... ... ... ... ... ...

还有一个黑名单list:
list = ['冬', '难', '喜', '杯']
通过SQL update更新数据,若表中某一条记录的key*字段的值在黑名单list中,则将其和其对应的value变为Null(注意只是该key和对应的value,不是整个记录)。
比如上述的例子处理后得到:

id key1 value1 key2 value2 key3 value3 key4 value4
1 Null Null 0.513 西 0.961 0.756
2 0.962 Null Null 0.625 0.533
3 西 0.628 0.268 0.156 Null Null
4 Null Null 0.894 0.625 西 0.268
... ... ... ... ... ... ... ... ...

那么问题来了:
假如
1.有一百万条记录(id:1 ~ 1,000,000)
2.有十个key-value对(key1,value1 ~ key10,value10)
3.黑名单list有十万个词汇
如何可以快速的更新整个数据表?

我的笨方法是:

...
for key in list:
    for i in range(1,11):
        sql = "UPDATE table_name SET key1=Null, value1=Null WHERE key%d='%s'" % (i, key)
        cursor.execute(sql)
... 

但是这个速度很慢,想请问如何能更快速的更新整个数据表?

PHP中文网PHP中文网2864일 전656

모든 응답(3)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 16:22:31

    저번에 비슷한 질문에 대한 링크를 드리겠습니다. 도움이 되셨으면 좋겠습니다
    https://segmentfault.com/q/10...

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 16:22:31

    블랙리스트 데이터는 테이블 이름 black_list, 필드 이름은 이름, 이름에 대한 인덱스 생성과 같은 데이터베이스 테이블에 저장됩니다.

    은 실행을 위해 10개의 SQL 문으로 나뉩니다.
    update t
    set key1 = null, value1 = null
    존재하는 곳(name = key1인 black_list에서 1개 선택);
    update t
    set key2 = null, value2 = null
    존재하는 곳(이름이 black_list에서 1개 선택) key2);
    유추하여 key10, value10 필드를 업데이트합니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 16:22:31

    으아악

    1.*

    으아악

    key_value_table(key1,key2,key3,key4)에 인덱스 idx_key_value_table_key를 생성합니다.

    2.*

    으아악

    3.*

    으아악

    4.*

    으아악

    5.*

    회신하다
    0
  • 취소회신하다