회사에서 서비스용으로 사용하는 mysql이 최근 쿼리할 때 속도가 너무 느려서 쿼리 실행 계획을 확인해 보니 인덱스가 적용되지 않는 경우가 많습니다.
스토리지 엔진은 InnoDB를 사용합니다.
처음 메인 데이터베이스에서 쿼리를 시작했을 때, 왜 인덱스가 적용되지 않는지 늘 궁금했는데, 스탠바이 데이터베이스로 전환한 후에 스탠바이 데이터베이스가 유효하다는 것을 알게 되었습니다.
인덱스에 문제가 있지는 않은지 고민하기 시작했는데, 인덱스를 재구축해 보니 효율이 훨씬 더 높다는 걸 알게 됐어요.
간단하게 비교를 기록해 보세요.
mysql> explain select * from runinfo where status in (0, 2, 1, 3, 4, 7, 9, 10); +----+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ | 1 | SIMPLE | runinfo | All | status_2 | NULL | NULL | NULL | 2378055 | Using where | +----+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ row in set (0.00 sec)
위는 본관 실행계획입니다.
백업 데이터베이스의 실행 계획을 비교해보세요.
mysql> explain select * from runinfo where status in (0, 2, 1, 3, 4, 7, 9, 10); +----+-------------+---------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | runinfo | range | status_2 | status_2 | 4 | NULL | 116 | Using where | +----+-------------+---------+-------+---------------+----------+---------+------+------+-------------+ row in set (0.00 sec)
쿼리 중에 대기 데이터베이스가 인덱스 status_2에 적응하는 것을 볼 수 있습니다.
다음 명령을 실행하면 문제가 해결됩니다.
mysql> OPTIMIZE TABLE runinfo; +------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +------------------+----------+----------+-------------------------------------------------------------------+ | schedule.runinfo | optimize | note | Table does not support optimize, doing recreate + analyze instead | | schedule.runinfo | optimize | status | OK | +------------------+----------+----------+-------------------------------------------------------------------+ rows in set (47.13 sec)
다음날 보니 쿼리 속도가 다시 느려졌는데, 새로운 데이터가 기록되고 인덱스가 업데이트되지 않는지 조금 궁금했습니다.
위 내용은 mysql 인덱스가 적용되지 않는 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!