MySQL μλ²λ‘ μμ²λ 쿼리λ κ²°κ³Όλ λμΌνμ§λ§ κ·Έ κ²°κ³Όλ₯Ό λ§λ€μ΄ λ΄λ λ°©λ²μ λ§€μ° λ€μνλ€.
λ€μν λ°©λ² μ€, κ°μ₯ μ΅μ μ΄κ³ μ΅μμ λΉμ©μ΄ μλͺ¨λλ λ°©λ²μ μ ννλ μμ μ μ΅ν°λ§μ΄μ κ° λ΄λΉνλ€.
MySQL μ΅ν°λ§μ΄μ λ 쿼리λ₯Ό μ²λ¦¬νκΈ° μν μ¬λ¬ κ°μ§ κ°λ₯ν λ°©λ²μ λ§λ€κ³ , κ° λ¨μ μμ μ λΉμ© μ 보μ λμ ν μ΄λΈμ μμΈ‘λ ν΅κ³ μ 보λ₯Ό μ΄μ©ν΄ μ€ν κ³νλ³ λΉμ©μ μ°μΆνλ€.
μ°μΆλ λΉμ©μ λ°νμΌλ‘, λΉμ©μ΄ μ΅μλ‘ μμλλ μ²λ¦¬ λ°©μμ μ ννλ π‘ λΉμ© κΈ°λ° μ΅ν°λ§μ΄μ μ΄λ€.
μ΅ν°λ§μ΄μ κ° λ§λ€μ΄ λ΄λ μ€ν κ³νμ μ΄ν΄ν μ μμ΄μΌ μ€ν κ³νμ λΆν©λ¦¬ν λΆλΆμ μ°Ύμλ΄κ³ , λ μ΅μ νλ λ°©λ²μΌλ‘ μ λν μ μλ€.
λ°μ΄ν° μ²λ¦¬
π ν ν μ΄λΈ μ€μΊκ³Ό ν μΈλ±μ€ μ€μΊ
ν ν μ΄λΈ μ€μΊμ μΈλ±μ€λ₯Ό μ¬μ©νμ§ μκ³ ν μ΄λΈμ λͺ¨λ λ μ½λλ₯Ό μ½λ κ²μ΄λ€.
ν μΈλ±μ€ μ€μΊμ, λ§ κ·Έλλ‘ μΈλ±μ€λ‘ μ€μ λ μΉΌλΌμ κΈ°μ€μΌλ‘ μΈλ±μ± λ λͺ¨λ λ μ½λλ₯Ό μ½λ κ²μ΄λ€.
π¨ μΈλ±μ€λ₯Ό μ΄μ©ν μ μλ μ‘°κ±΄λ¬Έμ΄ μκ±°λ ν μ΄λΈ λ μ½λ μ 체 건μκ° λ무 μμμ μΈλ±μ€λ₯Ό ν΅ν΄ μ½λ κ²μ΄ λΉν¨μ¨μ μ΄λΌκ³ νλ¨λλ κ²½μ° ν μ΄λΈ ν μ€μΊμ μ¬μ©νλ€.
π‘ MySQL InnoDB λ νΉμ ν μ΄λΈμ μ°μλ λ°μ΄ν° νμ΄μ§κ° μ½νλ©΄, μμ²μ΄ μ€κΈ° μ μ νμ΄μ§λ₯Ό λ²νΌμ μ μ₯(리λ μ΄ν€λ : Read Ahead)ν΄λμ΄ μ±λ₯μ ν₯μμν¨λ€.
innodb_read_ahead_threshold μμ€ν λ³μλ₯Ό μ΄μ©ν΄, λ³μμ μ€μ λ κ°μλ§νΌ μ°μλ νμ΄μ§κ° μ½νλ©΄ 리λ μ΄ν€λλ₯Ό μμν μ μλλ‘ μκ³κ°μ μ€μ ν μ μλ€.
π λ³λ ¬ μ²λ¦¬
MySQL 8.0μ innodb_parallel_read_threads μμ€ν λ³μλ₯Ό μ΄μ©ν΄ νλμ 쿼리λ₯Ό μ΅λ λͺκ°μ μ€λ λλ₯Ό μ΄μ©ν΄ μ²λ¦¬ν μ§ μ€μ ν μ μλ€.
π‘ μλ¬΄λ° WHERE 쑰건 μμ΄ λ¨μν ν μ΄λΈμ μ 체 건μλ₯Ό κ°μ Έμ€λ 쿼리λ§, νλμ 쿼리λ₯Ό λ³λ ¬λ‘ μ²λ¦¬ν μ μλ€.
π ORDER BY μ²λ¦¬
λ μ½λλ₯Ό 1~2건 κ°μ Έμ€λ 쿼리λ₯Ό μ μΈνλ©΄ λλΆλΆμ SELECT 쿼리μμ μ λ ¬μ νμμ μΌλ‘ μ¬μ©λλ€.
μνΈ λ²νΌ
MySQLμ΄ μ λ ¬μ μννκΈ° μν΄ λ³λλ‘ ν λΉλ°μ 곡κ°μ μνΈ λ²νΌλΌκ³ νλ€.
λ²νΌμ ν¬κΈ°λ λ μ½λμ ν¬κΈ°μ λ°λΌ κ°λ³μ μΌλ‘ μ¦κ°νκ³ , μ΅λ μ¬μ© κ°μΌν μνΈ λ²νΌμ 곡κ°μ sort_buffer_size λΌλ μμ€ν λ³μλ‘ μ€μ ν μ μλ€.
π¨ λ§μ½ μ λ ¬ν΄μΌν λ μ½λμ 건μκ° μνΈ λ²νΌλ‘ ν λΉλ 곡κ°λ³΄λ€ ν° κ²½μ° λ¬Έμ κ° λ μ μλ€.
μνΈ λ²νΌμ λ΄μ μ μλ λ§νΌ κ°μ Έμμ μ λ ¬μ μνν λ€, μμλ‘ λμ€ν¬μ κΈ°λ‘ν΄λκ³
λ€μ λ μ½λλ₯Ό κ°μ Έμμ μ λ ¬μ μννκ³ λμ€ν¬μ κΈ°λ‘νλ μμ μ λ°λ³΅νκ² λλ€.
μ΄ μμ μ΄ μ¦μμ§ μλ‘ μ±λ₯μ΄ λ¨μ΄μ§κ³ , κ·Έλ λ€κ³ μνΈ λ²νΌμ ν¬κΈ°λ₯Ό ν€μ°λ©΄ ν° λ©λͺ¨λ¦¬ ν λΉ λλ¬Έμ μ±λ₯μ΄ λ¨μ΄μ§ μ μλ€.
μ λ ¬ μκ³ λ¦¬μ¦
λ μ½λλ₯Ό μ λ ¬ν λ, λ μ½λ μ 체λ₯Ό μνΈ λ²νΌμ λ΄μμ§ λλ μ λ ¬ κΈ°μ€ μΉΌλΌλ§ μνΈ λ²νΌμ λ΄μμ§μ λ°λΌ λλ μ μλ€.
-- // μ΅ν°λ§μ΄μ νΈλ μ΄μ€ νμ±ν
SET OPTIMIZER_TRACE = "enabled=on", END_MARKERS_IN_JSON=on;
SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;
μ ꡬ문μΌλ‘ μ΅ν°λ§μ΄μ νΈλ μ΄μ€λ₯Ό νμ±ν μν€κ³ 쿼리λ₯Ό μ€νν λ€
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE \G
μ ꡬ문μΌλ‘ νΈλ μ΄μ€ λ΄μ©μ νμΈν΄λ³΄λ©΄
sort_mode νλλ‘ μ λ ¬ λ°©μμ νμΈν μ μλ€.
<sort_key , rowid > : μ λ ¬ ν€μ λ μ½λμ λ‘μ° μμ΄λ(Row ID)λ§ κ°μ Έμμ μ λ ¬νλ λ°©μ
<sort_key , additional_fields > : μ λ ¬ ν€μ λ μ½λ μ 체λ₯Ό κ°μ Έμμ μ λ ¬νλ λ°©μ (λ μ½λ μΉΌλΌλ€μ κ³ μ μ¬μ΄μ¦λ‘ λ©λͺ¨λ¦¬ μ μ₯)
<sort_key , packed_additional_fields> : μ λ ¬ ν€μ λ μ½λ μ 체λ₯Ό κ°μ Έμμ μ λ ¬νλ λ°©μ (λ μ½λ μΉΌλΌλ€μ κ°λ³ μ¬μ΄μ¦λ‘ λ©λͺ¨λ¦¬ μ μ₯)
MySQL 5.7 λ²μ λΆν°λ λ©λͺ¨λ¦¬ 곡κ°μ ν¨μ¨μ μΈ μ¬μ©μ μν΄ 3λ²μ§Έ λ°©μμ μ¬μ©νλ€κ³ νλ€.
π‘λ μ½λ μ 체λ₯Ό κ°μ Έμμ μ λ ¬νλ λ°©μμ λ§μ μνΈ λ²νΌ 곡κ°μ΄ νμνμ§λ§ ν μ΄λΈμ 2λ² μ½μ νμκ° μκ³
Row IDλ§ κ°μ Έμμ μ λ ¬νλ λ°©μμ μνΈ λ²νΌμ ν¬κΈ°λ μ κ² μ¬μ©ν μ μμ§λ§ λ€λ₯Έ μΉΌλΌμ κ°μ Έμ€κΈ° μν΄ μ λ ¬λ ROW ID λ‘ ν μ΄λΈμ νλ² λ μ½μ΄μΌ νλ€.
λ°λΌμ, λ μ½λμ ν¬κΈ°λ 건μκ° μμ κ²½μ° λ μ½λ μ 체λ₯Ό κ°μ Έμ€λ κ²μ΄ μ±λ₯μ΄ μ’λ€.