描述问题:
目前想用SQL语句来查询一个表(50万条),并将表内昵称为空的用户Openid拿出来,每百条查询一次。环境MySQL。
问题关键:
一次性取出,分百条查询,也会给服务器造成很大压力(*1),能不能让SQL查询出100条符合结果的记录,并返回最后一条的ID?
拓展:
除了我这种想法,业界有没有一个合适的方案?或者关于SQL大容量查询 的一些书籍。
*1:首先,我的服务器是小水管,50万条已经相当重了。其次,就算我现在扩展服务器配置,假设某天达到了1亿条,也会成为很大的负载压力。
表结构:
id openid nickname avatar
部分openid的nickname或avatar(头像)是空的,想要每次查出100个nickname或avatar(头像)为空的openid,并调用微信接口,将获取到的信息插入。
질문이 좀 이상하네요. 데이터 100개를 반환하시겠습니까? 아니면 이 100개의 데이터 중 마지막
ID
을 반환해야 할까요?우선 50만 개의 데이터는 서버가 배포된 머신의 성능이 매우 좋지 않은 것이 아니라면 그다지 많은 양은 아니므로 쿼리 속도는 그다지 느리지 않아야 합니다(매우 복잡하거나 성능이 낮은 글을 쓰지 않는 한). SQL)을 여러 번 검색하는 것이 실제로 가능합니다. 데이터베이스 부담을 줄이되 네트워크 전송 부담을 높이세요.
또한, 50W 테이블 데이터용 솔루션은 1E 테이블 데이터용 솔루션과 전혀 다르므로, 하나의 솔루션이 단번에 해결될 수 있다고 가정하지 마십시오.
첨부된 SQL:
으아악OR
을 사용하므로nickname
,avatar
의 인덱스는 필요하지 않을 것으로 추정되거나,completed
이라는 필드를 추가하여 기록 완료 여부를 표시할 수 있습니다(예:nickname
및avatar
가 비어 있지 않으면 이 필드는 프로그램이 데이터를 삽입할 때 유지되므로 쿼리 SQL은OR
연결을 피할 수 있습니다.쿼리해야 하는 모든 필드에 인덱스를 구축하세요. 현재 시나리오에서는 수천만 개의 데이터에 대한 부담이 없습니다
1.인덱스가 추가됐나요?
2. SQL 최적화
데이터 50만개는 사실 많은 양이 아닙니다.
어떤 기능을 구현하려는지 모르겠습니다. 100개의 항목을 찾는 것은 의미가 없지만 마지막 열 중 하나만 반환하면 500,000개의 데이터만 인덱싱된 쓰기 저장 프로세스를 구현해야 하는 경우입니다. 마찬가지
480w 행이 있는 테이블은 검증된 열을 확인하고 전체 행을 모두 반환하는 데 10초밖에 걸리지 않습니다. 문제는 검증된 행이 너무 많고 출력할 때 메모리가 부족하다는 것입니다. 결과를 하나씩 새 테이블에 삽입하면 시간이 더 느려집니다.
인덱스를 추가하거나 정기적으로 캐시에 데이터베이스를 작성하세요
이런 건 지루하고 제 평판을 망치는 일이에요. 결과가 좋지 않으면 그냥 삭제하면 됩니다.