>데이터 베이스 >MySQL 튜토리얼 >수백만 건의 데이터에서 MySQL 조건부 쿼리 및 페이징 쿼리 시 주의사항

수백만 건의 데이터에서 MySQL 조건부 쿼리 및 페이징 쿼리 시 주의사항

藏色散人
藏色散人앞으로
2019-04-17 17:53:083683검색

이전 섹션 "수백만 개의 데이터로 인한 Mysql 페이징 문제"에 이어서 쿼리 조건을 추가합니다:

select id from news 
where cate = 1
order by id desc 
limit 500000 ,10 
查询时间 20 秒

정말 무서운 속도입니다! ! 첫 번째 섹션 "수백만 개의 데이터 MySQL 데이터 테스트 환경 소개"의 지식을 사용하여 최적화하세요.

select * from news
where cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10 
查询时间 15 秒

최적화 효과는 분명하지 않으며 조건의 영향은 여전히 ​​큽니다! 이 경우 SQL 문을 아무리 최적화해도 운영 효율성 문제를 해결할 수 없습니다. 그러면 아이디어를 바꿔서 기사의 ID와 분류 정보만 기록하는 색인 ​​테이블을 만듭니다. 기사 콘텐츠의 넓은 필드를 별도의 부분으로 나눕니다.

表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ]
-------------------------------------------------
idint11主键自动增加
cateint11索引

데이터를 쓸 때 두 테이블을 동기화하세요. 쿼리의 경우 news2를 사용하여 조건부 쿼리를 수행할 수 있습니다.

select * from news
where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10

조건 id >는 나중에 news2 테이블에서 사용됩니다.

런닝타임 1.23초, 런닝타임이 20배 가까이 단축된 것을 확인할 수 있어요! ! 데이터가 100,000개 정도일 때 쿼리 시간은 약 0.5초 정도로 유지할 수 있는데, 이는 우리가 허용할 수 있는 수준에 점차 가까워지는 값입니다!

하지만 1초는 여전히 서버에 허용되지 않는 값입니다! ! 최적화할 수 있는 다른 것이 있나요? ? 우리는 큰 변화를 시도했습니다:

news2의 스토리지 엔진을 innodb로 변경했는데 실행 결과가 놀라웠습니다!

select * from news
where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
order by id desc 
limit 0,10

단 0.2초, 엄청난 속도. 왜 그렇게 큰 차이가 있습니까? mysql 스토리지 엔진에 대한 자세한 설명은 다음 기사를 참조하세요.

위 내용은 수백만 건의 데이터에서 MySQL 조건부 쿼리 및 페이징 쿼리 시 주의사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 hcoder.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제