1,033,990개의 행이 있는 "질문" 테이블이 있는 "대수학" 데이터베이스가 있습니다. 레코드에는 INT인 'solved' 속성이 있습니다. 간단한 문의사항이 있습니다
select count(*) from questions where solved = 0
비슷한 CPU를 사용하는 두 대의 서버가 있습니다. 두 서버 모두에서 테이블은 동일합니다. (데이터베이스는 프로덕션의 복제본입니다). 그들은 SSD에 있습니다. 한 서버에는 MySQL 5.5.49가 포함된 Ubuntu 14.04가 있고, 다른 서버에는 MySQL 5.7.12가 포함된 Ubuntu 16.04가 있습니다.
문제는 이 쿼리가 MySQL 5.5에서는 0.009초밖에 걸리지 않지만 MySQL 5.7에서는 0.304초가 걸린다는 것입니다. 34배 더 느립니다!!!
쿼리 계획은 대략 비슷합니다.
느린 서버:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE questions NULL index NULL by_topic_solved 97 NULL 1033990 10.00 Using where; Using index
빠른 서버:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE questions index NULL by_topic_solved 97 NULL 1033989 Using where; Using index
왜 이런 일이 일어날 수 있는지는 나를 당혹스럽게 만듭니다. 나는 이 새로운 5.7 설정에서 더 복잡한 다른 성능 문제를 보았지만 이는 기본 쿼리 측면에서 해결해야 할 가장 간단한 문제입니다.
이에 대한 설명이나 시작점을 찾고 있습니다. my.cnf는 둘 사이에서 대략 유사했습니다. 어떤 제안이라도 감사하게 받아들여질 것입니다.
답변1
나는 이 문제를 완전히 이해했습니다. 변경된 점은 새로운 mysql에서는 query_cache_type = OFF의 기본 설정으로 인해 쿼리 캐시가 비활성화된다는 것입니다. query_cache_type=1을 설정하여 쿼리 캐시를 다시 활성화하자 더 나은 성능이 바로 나타났습니다. 내 사이트는 INSERT/UPDATE 쿼리보다 100배 더 많은 SELECT 쿼리를 사용하므로 쿼리 캐시를 사용하는 것이 적합합니다. 이 방향을 보도록 알려주셔서 감사합니다!