inspeep

When Forum Page Loads Are Slow: Checking Index Effectiveness Using SQLite Execution Plans

Views 11
Likes 0
Comments 0
🌐
Notice: This content is displayed in its original language to preserve layout and media formatting.
Please use your browser's built-in translation feature (e.g., Google Chrome Translate) for the best reading experience.
1. 느린 λͺ©λ‘ 쑰회λ₯Ό μ–΄λ–»κ²Œ μž‘κ²Œ μž¬ν˜„ν• κΉŒμš”?

κ²Œμ‹œνŒμ— 글이 μŒ“μ΄λ©΄μ„œ λͺ©λ‘μ΄ λŠλ €μ§€λ©΄ λ°μ΄ν„°λ² μ΄μŠ€ μ œν’ˆμ„ λ°”κΎΈκ±°λ‚˜ μ„œλ²„λ₯Ό λŠ˜λ €μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¨Όμ € 같은 쑰건의 μ‘°νšŒκ°€ 무엇을 읽고 μ–΄λ–»κ²Œ μ •λ ¬ν•˜λŠ”μ§€ 확인해야 ν•©λ‹ˆλ‹€. ν•œ νŽ˜μ΄μ§€μ— ν‘œμ‹œλ˜λŠ” 글이 적어도 κ·Έ 글을 μ°ΎλŠ” κ³Όμ •μ—μ„œ λ§Žμ€ 데이터λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이 글은 운영 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬ μ•ˆμ— 가상 κ²Œμ‹œκΈ€ 1만 건을 λ§Œλ“­λ‹ˆλ‹€. μΉ΄ν…Œκ³ λ¦¬λ³„ μ΅œμ‹  κΈ€ 10개λ₯Ό μ‘°νšŒν•˜λŠ” SQL을 κ³ μ •ν•˜κ³  인덱슀 μ „ν›„μ˜ μ‹€ν–‰ κ³„νšκ³Ό κ²°κ³Όλ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€. μ‹€μ œ μ‚¬μ΄νŠΈκ°€ PostgreSQLμ΄λ‚˜ MySQL을 μ‚¬μš©ν•œλ‹€λ©΄ μ•„λž˜ SQLite κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ μ„±λŠ₯ 수치둜 μ μš©ν•˜μ§€ λ§ˆμ„Έμš”.


2. μ‹€ν–‰ κ³„νšκ³Ό μ‹€ν–‰ μ‹œκ°„μ€ λ‹€λ¦…λ‹ˆλ‹€

EXPLAIN QUERY PLAN은 SQLiteκ°€ 쑰회λ₯Ό μ²˜λ¦¬ν•  경둜λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. SCAN은 전체 μŠ€μΊ”μ„, SEARCHλŠ” 쑰건을 μ΄μš©ν•œ 탐색을 λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ ν‘œν˜„ λ¬Έμžμ—΄κ³Ό 좜λ ₯ ν˜•μ‹μ€ 버전에 따라 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμžμ—΄μ„ κ³ μ •ν•΄ ν”„λ‘œκ·Έλž¨ λ‘œμ§μ„ λ§Œλ“œλŠ” 것보닀 진단 자료둜 μ‚¬μš©ν•˜λŠ” 편이 μ ν•©ν•©λ‹ˆλ‹€.

μ‹€ν–‰ κ³„νšμ΄ λ°”λ€Œμ—ˆλ‹€κ³  무쑰건 체감 속도가 λͺ‡ λ°° μ’‹μ•„μ‘Œλ‹€κ³  말할 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. 데이터 규λͺ¨, μΊμ‹œ μƒνƒœ, μ €μž₯ μž₯치, λ™μ‹œ μš”μ²­μ΄ λ‹€λ¦…λ‹ˆλ‹€. 이번 μ‹€μŠ΅μ—μ„œλŠ” μ‹€μ œλ‘œ ν™•μΈν•œ κ³„νš 변화와 κ²°κ³Ό 일치만 κΈ°λ‘ν•©λ‹ˆλ‹€. μ‹œκ°„ 수치λ₯Ό μ£Όμž₯ν•˜λ €λ©΄ 같은 μ‘°κ±΄μ—μ„œ 반볡 μΈ‘μ •ν•œ 방법과 νŽΈμ°¨λ„ ν•¨κ»˜ μ œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.


3. 쑰회 쑰건에 λ§žλŠ” 볡합 인덱슀λ₯Ό μƒκ°ν•©λ‹ˆλ‹€

μ˜ˆμ œλŠ” categoryκ°€ it인 행을 μ°Ύκ³  idλ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ λ’€ 10개λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. category와 idλ₯Ό ν¬ν•¨ν•œ 볡합 μΈλ±μŠ€κ°€ 이 μ‘°νšŒμ— μ–΄λ–€ 영ν–₯을 μ£ΌλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 인덱슀 μ„€κ³„λŠ” μ—΄ μ΄λ¦„λ§Œ 보고 ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 자주 μ‚¬μš©ν•˜λŠ” WHERE와 ORDER BYλ₯Ό ν•¨κ»˜ μ‚΄νŽ΄λ³΄λŠ” μž‘μ—…μž…λ‹ˆλ‹€.

μ‹€μ œ κ²Œμ‹œνŒμ΄ created_at으둜 μ •λ ¬ν•˜κ±°λ‚˜ μ˜ˆμ•½ λ°œν–‰, 곡지, 곡개 λ²”μœ„λ₯Ό ν•„ν„°λ§ν•œλ‹€λ©΄ 쿼리가 λ‹¬λΌμ§‘λ‹ˆλ‹€. 예제의 인덱슀λ₯Ό κ·Έ μ‚¬μ΄νŠΈμ— λ°”λ‘œ μΆ”κ°€ν•˜μ§€ λ§ˆμ„Έμš”. κΈ°μ‘΄ μΈλ±μŠ€μ™€ 쑰회 쑰건을 ν™•μΈν•˜κ³  후보 ν•˜λ‚˜λ₯Ό κ²€μ¦μš© ν™˜κ²½μ—μ„œ λΉ„κ΅ν•©λ‹ˆλ‹€. λΉ„μŠ·ν•œ μ΄λ¦„μ˜ 쀑볡 인덱슀λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“œλŠ” 것은 관리 λΉ„μš©μ„ 늘릴 수 μžˆμŠ΅λ‹ˆλ‹€.


4. κ²°κ³Όλ₯Ό λ¨Όμ € κ³ μ •ν•œ λ’€ κ³„νšμ„ λΉ„κ΅ν•©λ‹ˆλ‹€

μ•„λž˜ μ½”λ“œλŠ” μ •ν•΄μ§„ κ·œμΉ™μœΌλ‘œ 1만 개의 행을 μ‚½μž…ν•©λ‹ˆλ‹€. λ§€ μ—΄ 번째 ν–‰λ§Œ it둜 μ§€μ •ν•΄ κ²°κ³Όλ₯Ό μž¬ν˜„ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 인덱슀λ₯Ό μΆ”κ°€ν•˜κΈ° μ „ κ²°κ³Όλ₯Ό λ³΄κ΄€ν•˜κ³ , μΆ”κ°€ ν›„ 같은 결과인지 assert둜 ν™•μΈν•©λ‹ˆλ‹€. 이 κ²€μ‚¬λŠ” λΉ λ₯Έ μ‘°νšŒκ°€ μ˜¬λ°”λ₯Έ μ‘°νšŒμ΄κΈ°λ„ ν•œμ§€ ν™•μΈν•˜λŠ” μ΅œμ†Œ μ ˆμ°¨μž…λ‹ˆλ‹€.

쑰회 값을 SQL λ¬Έμžμ—΄μ— 직접 μ—°κ²°ν•˜μ§€ μ•Šκ³  λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. μ˜ˆμ œμ—μ„œ μž…λ ₯은 고정돼 μžˆμ§€λ§Œ μ‹€μ œ 검색 μ‘°κ±΄μ—μ„œλ„ 같은 μŠ΅κ΄€μ„ μœ μ§€ν•˜λŠ” 편이 μ’‹μŠ΅λ‹ˆλ‹€. in-memory λ°μ΄ν„°λ² μ΄μŠ€λŠ” ν”„λ‘œκ·Έλž¨μ΄ λλ‚˜λ©΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. 둜컬의 μ‹€μ œ DB νŒŒμΌμ„ μ‹€μŠ΅ λŒ€μƒκ³Ό ν˜Όλ™ν•˜μ§€ μ•Šλ„λ‘ μ‹€ν–‰ 전에 μ—°κ²° λ¬Έμžμ—΄μ„ ν™•μΈν•˜μ„Έμš”.


5. 인덱슀λ₯Ό 늘리면 μƒκΈ°λŠ” λΉ„μš©λ„ μžˆμŠ΅λ‹ˆλ‹€

μΈλ±μŠ€λŠ” 읽기 μž‘μ—…μ„ λ•μ§€λ§Œ μ‚½μž…κ³Ό μˆ˜μ • λ•Œλ„ 관리해야 ν•©λ‹ˆλ‹€. 글을 자주 μˆ˜μ§‘ν•˜λŠ” μ‚¬μ΄νŠΈμ—μ„œλŠ” μ“°κΈ°λŸ‰κ³Ό 인덱슀 μ €μž₯ 곡간을 ν•¨κ»˜ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‘°νšŒκ°€ λŠλ¦¬λ‹€λŠ” 이유만으둜 λͺ¨λ“  열에 인덱슀λ₯Ό μΆ”κ°€ν•˜λ©΄ 쓰기와 μœ μ§€ 관리에 뢀담이 생길 수 μžˆμŠ΅λ‹ˆλ‹€.

특히 λ³Έλ¬Έ 검색, 일뢀 λ¬Έμžμ—΄ 검색, λ‹€λ₯Έ μ •λ ¬ 기쀀은 같은 인덱슀의 효과λ₯Ό κΈ°λŒ€ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ μ μš©μ΄λ‚˜ 쑰건 ν˜•νƒœλ„ μ€‘μš”ν•©λ‹ˆλ‹€. 이번 예제의 category 동등 쑰건과 일반 제λͺ© 검색은 λ‹€λ₯Έ λ¬Έμ œμž…λ‹ˆλ‹€. λͺ©λ‘ 쑰회λ₯Ό κ°œμ„ ν•œ κ²°κ³Όλ₯Ό 전체 검색 μ„±λŠ₯ κ°œμ„ μœΌλ‘œ ν™•λŒ€ν•΄ μ„€λͺ…ν•˜μ§€ λ§ˆμ„Έμš”.


6. μš΄μ˜μ— μ μš©ν•˜κΈ° 전에 확인할 ν•­λͺ©

μ‹€μ œ 쑰회 SQLκ³Ό μ‹€ν–‰ κ³„νšμ„ ν™•λ³΄ν•˜κ³ , 자주 μ‚¬μš©ν•˜λŠ” 쑰건과 느린 쑰건을 λ”°λ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€. 데이터가 적은 개발 ν™˜κ²½μ—μ„œλ§Œ μ‹œν—˜ν•˜λ©΄ 운영 규λͺ¨μ˜ λΉ„μš©μ„ 놓칠 수 μžˆμŠ΅λ‹ˆλ‹€. κ°œμΈμ •λ³΄λ₯Ό μ œκ±°ν•œ λŒ€ν‘œ λ°μ΄ν„°λ‚˜ 별도 μ‹œν—˜ ν™˜κ²½μ„ μ‚¬μš©ν•˜κ³  κ²°κ³Ό ν–‰μ˜ μˆœμ„œμ™€ 곡개 λ²”μœ„λ„ ν™•μΈν•˜μ„Έμš”.

변경은 κΈ°μ‘΄ 인덱슀 λͺ©λ‘κ³Ό 되돌릴 방법을 κΈ°λ‘ν•œ λ’€ μ§„ν–‰ν•©λ‹ˆλ‹€. μ‚¬μš© 쀑인 DB μ œν’ˆμ— 따라 인덱슀 생성 μ€‘μ˜ μž κΈˆμ΄λ‚˜ λΆ€ν•˜κ°€ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€. SQLite μ‹€μŠ΅λ§ŒμœΌλ‘œ κ·Έ 운영 영ν–₯을 νŒλ‹¨ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ•± λ‚΄λΆ€ μΊμ‹œμ™€ DB 인덱슀의 νš¨κ³Όλ„ ꡬ뢄해 μΈ‘μ •ν•΄μ•Ό μ‹€μ œ 병λͺ©μ΄ 남아 μžˆλŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


7. 쑰회 쑰건을 λ°”κΎΈμ–΄ ν•œκ³„λ₯Ό ν™•μΈν•˜κΈ°

μ˜ˆμ œμ—μ„œ λ°˜ν™˜ 열을 id λŒ€μ‹  title둜 λ°”κΎΈκ³  κ³„νšμ΄ μ–΄λ–»κ²Œ λ‹¬λΌμ§€λŠ”μ§€ μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μΈλ±μŠ€κ°€ 탐색에 μ‚¬μš©λΌλ„ ν•„μš”ν•œ 데이터λ₯Ό μ–»λŠ” κ²½λ‘œλŠ” λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ³€ν™”λŠ” κ²°κ³Όκ°€ ν‹€λ Έλ‹€λŠ” 뜻이 μ•„λ‹ˆλΌ λΉ„μš©μ„ 읽을 ν•­λͺ©μ΄ λ‹¬λΌμ‘Œλ‹€λŠ” λœ»μž…λ‹ˆλ‹€. 원본 예제의 covering κ²°κ³Όλ₯Ό λͺ¨λ“  λ°˜ν™˜ 열에 ν™•λŒ€ν•˜μ§€ λ§ˆμ„Έμš”.

μΉ΄ν…Œκ³ λ¦¬κ°€ free인 κ²½μš°λ„ λΉ„κ΅ν•©λ‹ˆλ‹€. 데이터 뢄포가 λ‹€λ₯΄λ©΄ μ„ νƒν•œ 쑰건이 전체 ν–‰μ˜ μ–΄λŠ 정도λ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ λ‹¬λΌμ§‘λ‹ˆλ‹€. 같은 SQL이라고 λͺ¨λ“  κ°’μ—μ„œ λΉ„μš©μ΄ κ°™λ‹€κ³  보기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 운영 ν™˜κ²½μ—μ„œλŠ” λ°©λ¬Έμžκ°€ 자주 μ„ νƒν•˜λŠ” κ²Œμ‹œνŒκ³Ό λ“œλ¬Έ κ²Œμ‹œνŒμ„ ꡬ뢄해 μ κ²€ν•˜λ©΄ κ°œμ„ μ˜ 효과λ₯Ό 더 ν˜„μ‹€μ μœΌλ‘œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

νŽ˜μ΄μ§€ λ²ˆν˜Έκ°€ 컀질 λ•Œμ˜ λͺ©λ‘ μ‘°νšŒλ„ 별도 μ£Όμ œμž…λ‹ˆλ‹€. 이번 SQL은 μ΅œμ‹  10개만 κ°€μ Έμ˜€λ©° μ•„μ£Ό κΉŠμ€ OFFSET 쑰회λ₯Ό μ‹œν—˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΅œμ‹  κΈ€ μ‘°νšŒκ°€ κ°œμ„ λλ‹€λŠ” κ²°κ³Όλ₯Ό 였래된 λͺ¨λ“  λͺ©λ‘μ˜ 속도 κ°œμ„ μœΌλ‘œ μ„€λͺ…ν•˜μ§€ λ§ˆμ„Έμš”. μ‹€μ œ μ„œλΉ„μŠ€κ°€ μ‚¬μš©ν•˜λŠ” νŽ˜μ΄μ§• 방식과 ν—ˆμš© λ²”μœ„λ₯Ό ν•¨κ»˜ 확인해야 ν•©λ‹ˆλ‹€. 검색과 μ •λ ¬ μ˜΅μ…˜λ„ 같은 이유둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

μΈ‘μ • κΈ°λ‘μ—λŠ” SQLite 버전, ν–‰ 수, 데이터 생성 κ·œμΉ™, 쑰회 쑰건과 λ°˜ν™˜ 열을 μ μŠ΅λ‹ˆλ‹€. 적용 μ „ν›„μ˜ κ³„νšκ³Ό κ²°κ³Ό κ°œμˆ˜λ„ μ €μž₯ν•˜μ„Έμš”. μ‹€ν–‰ μ‹œκ°„ 츑정을 μΆ”κ°€ν•œλ‹€λ©΄ 쀀비와 μ‚½μž… μ‹œκ°„μ„ μ œμ™Έν•˜κ³  쑰회 ꡬ간을 λ°˜λ³΅ν•΄μ„œ μΈ‘μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ²°κ³Όλ₯Ό ν•œ 번 읽은 λ’€μ˜ μΊμ‹œ νš¨κ³Όλ„ κ³ λ €ν•˜κ³  μΈ‘μ • ν™˜κ²½μ„ κ³΅κ°œν•˜λ©΄ λ‹€λ₯Έ μ‚¬λžŒμ΄ λΉ„κ΅ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

인덱슀 후보λ₯Ό μš΄μ˜μ— μ œμ•ˆν•  λ•ŒλŠ” 읽기 κ°œμ„ λΏ μ•„λ‹ˆλΌ κΈ€ μ‚½μž…κ³Ό μˆ˜μ • λΉˆλ„λ₯Ό μ μŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ— κ°€ν•΄μ§€λŠ” μ‹€μ œ λΆ€ν•˜λ₯Ό μ•Œμ§€ λͺ»ν•˜λ©΄ 단정적인 λΉ„μš© μ ˆκ°μ„ μ£Όμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이번처럼 μž‘κ²Œ μž¬ν˜„ν•œ μ‚¬λ‘€λŠ” 가섀을 ν™•μΈν•˜λŠ” 좜발점이며 운영 λ³€κ²½μ˜ μ΅œμ’… 검증은 μ•„λ‹™λ‹ˆλ‹€. 결과의 λ²”μœ„λ₯Ό μ •ν™•ν•˜κ²Œ μ „λ‹¬ν•˜λŠ” 편이 μœ μ§€ 관리에 도움이 λ©λ‹ˆλ‹€.


8. 따라 ν•˜λŠ” 예제

λͺ…λ Ήκ³Ό μ½”λ“œλŠ” ν•™μŠ΅μš©μž…λ‹ˆλ‹€. μ„€λͺ…에 ν‘œμ‹œλœ μ‹€ν–‰ ν™˜κ²½μ„ κ΅¬λΆ„ν•˜κ³  μƒˆ μ‹œν—˜ 폴더 λ˜λŠ” λͺ¨μ˜ μž…λ ₯으둜 μ‹œμž‘ν•˜μ„Έμš”.

예제 μ½”λ“œ

import sqlite3
con = sqlite3.connect(':memory:')
con.execute('CREATE TABLE posts(id INTEGER PRIMARY KEY, category TEXT, title TEXT)')
con.executemany('INSERT INTO posts(category,title) VALUES (?,?)',
    [('it' if i % 10 == 0 else 'free', f'post {i}') for i in range(10000)])
sql = 'SELECT id FROM posts WHERE category=? ORDER BY id DESC LIMIT 10'
args = ('it',)
print('before:', con.execute('EXPLAIN QUERY PLAN ' + sql, args).fetchall())
expected = con.execute(sql, args).fetchall()
con.execute('CREATE INDEX idx_posts_category_id ON posts(category,id)')
print('after:', con.execute('EXPLAIN QUERY PLAN ' + sql, args).fetchall())
assert con.execute(sql, args).fetchall() == expected
con.close()


9. 검증 결과와 해석

확인 ν•­λͺ©κ²°κ³Ό λ˜λŠ” 검증 λ²”μœ„
ν–‰ 수10,000
적용 μ „SCAN posts
적용 ν›„SEARCH posts USING COVERING INDEX idx_posts_category_id (category=?)
쑰회 결과적용 μ „ν›„ 동일
속도 λ°°μˆ˜μΈ‘μ •Β·μ£Όμž₯ν•˜μ§€ μ•ŠμŒ

Python 3.12 λ‚΄μž₯ SQLite둜 μ‹€ν–‰ κ³„νšκ³Ό κ²°κ³Ό 일치λ₯Ό ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 운영 DB와 λ™μ‹œ 접속 μƒν™©μ˜ 응닡 μ‹œκ°„μ„ μΈ‘μ •ν•œ κ²°κ³ΌλŠ” μ•„λ‹™λ‹ˆλ‹€.


10. 자주 λ¬»λŠ” 질문

SCAN이 λ‚˜μ˜€λ©΄ 항상 λ‚˜μœκ°€μš”?

μ•„λ‹™λ‹ˆλ‹€. μž‘μ€ ν…Œμ΄λΈ”μ΄λ‚˜ λ§Žμ€ 행을 μ½λŠ” μΏΌλ¦¬μ—μ„œλŠ” μ μ ˆν•œ 선택일 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œ λΉ„μš©κ³Ό λ°˜ν™˜ 쑰건을 ν•¨κ»˜ νŒλ‹¨ν•©λ‹ˆλ‹€.

COVERING INDEXλŠ” λ¬΄μ—‡μΈκ°€μš”?

이번 μ‘°νšŒμ— ν•„μš”ν•œ category와 idλ₯Ό μΈλ±μŠ€μ—μ„œ μ²˜λ¦¬ν•  수 μžˆλŠ” κ³„νšμž…λ‹ˆλ‹€. λ³Έλ¬Έ λ“± λ‹€λ₯Έ 열을 μΆ”κ°€ν•˜λ©΄ 같은 κ³„νšμ„ κΈ°λŒ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ‹€μ œ μ‚¬μ΄νŠΈμ— κ·ΈλŒ€λ‘œ 좔가해도 λ˜λ‚˜μš”?

μ‚¬μš© DB, 쿼리, κΈ°μ‘΄ μΈλ±μŠ€μ™€ 생성 영ν–₯을 확인해야 ν•©λ‹ˆλ‹€. 이 글은 ν•™μŠ΅μš© SQLite μ˜ˆμ œμž…λ‹ˆλ‹€.


11. 곡식 μ°Έκ³  자료

λ™μž‘ μ •μ˜μ™€ μ˜΅μ…˜μ€ μ•„λž˜ μ œμž‘μž λ¬Έμ„œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 본문의 사둀와 μ˜ˆμ œλŠ” ν•™μŠ΅μ„ μœ„ν•΄ λ…λ¦½μ μœΌλ‘œ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

예제 μž…λ ₯은 ν•™μŠ΅μš© λͺ¨μ˜ μžλ£Œμž…λ‹ˆλ‹€. μ‹€μ œ ν™˜κ²½μ— μ μš©ν•  λ•ŒλŠ” 본문에 μ•ˆλ‚΄ν•œ 검증 λ²”μœ„μ™€ 쑰건을 ν™•μΈν•˜μ„Έμš”.

πŸ’¬ 0 Comments

IT Board

Notice
Notice
Notice Inspeep Community Usage and Post Management Guidelines
πŸ‘€ κ΄€λ¦¬μž πŸ“… 2026.04.15 πŸ‘€ Views 57 πŸ‘ Likes 0
BEST
Thumbnail
BEST 1. Creating a website without knowing anything and teaching yourself coding: the swamp of domains and hosting
πŸ‘€ κ΄€λ¦¬μž πŸ“… 2026.03.05 πŸ‘€ Views 140 πŸ‘ Likes 0
BEST
Thumbnail
BEST 2. Conquering WordPress for a Coding Illiterate: The Attack of VS Code and FTP
πŸ‘€ κ΄€λ¦¬μž πŸ“… 2026.03.05 πŸ‘€ Views 135 πŸ‘ Likes 0
BEST
Thumbnail
BEST 3. Unable to connect!A novice developer's tearful server recovery success story
πŸ‘€ κ΄€λ¦¬μž πŸ“… 2026.03.05 πŸ‘€ Views 128 πŸ‘ Likes 0
BEST
Thumbnail
BEST 10. Overcoming the limitations of a corner server: From render backup to web development bulletin board development
πŸ‘€ κ΄€λ¦¬μž πŸ“… 2026.03.05 πŸ‘€ Views 120 πŸ‘ Likes 0
Random Pick
Thumbnail
Random Pick The success story of an engineering student wandering around a computer store (1)
πŸ‘€ 디둝 πŸ“… 2026.07.20 πŸ‘€ Views 12 πŸ‘ Likes 0
Random Pick
Thumbnail
Random Pick Shocking Facts About the Developer of XenoFeels
πŸ‘€ 디둝 πŸ“… 2026.07.15 πŸ‘€ Views 25 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
The Smiling iPhone Duo... Defects Are Popping Up Left and Right...JPG
πŸ‘€ K_Shit πŸ“… 2026.10.24 πŸ‘€ Views 0 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
When the 'iPhone Duo' is unfolded, half of some app screens appear as 'black space'
πŸ‘€ PPAOE πŸ“… 2026.10.23 πŸ‘€ Views 0 πŸ‘ Likes 0
개발
Thumbnail
A MAGA developer had something to say after seeing BioWare go under lol
πŸ‘€ 바루데여 πŸ“… 2026.10.23 πŸ‘€ Views 0 πŸ‘ Likes 0
개발
Thumbnail
A List of Upcoming Large-Scale Development Projects in Seoul
πŸ‘€ Maodun πŸ“… 2026.10.23 πŸ‘€ Views 0 πŸ‘ Likes 0
팁/정보
No Image
Airplane Mode, but I Can Still Use the Internet? Misconceptions About Smartphones Caused by Their Names
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.23 πŸ‘€ Views 3 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
개발
Thumbnail
Why AI Novels Can't Succeed, According to a Cheerful Developer
πŸ‘€ λ‘œλ£¨λ””λ‹€ πŸ“… 2026.10.22 πŸ‘€ Views 1 πŸ‘ Likes 0
자유
No Image
When a Domain Isn't Connecting: Steps to Troubleshoot DNS, HTTPS, and the Web Server Separately
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.21 πŸ‘€ Views 1 πŸ‘ Likes 0
개발
Thumbnail
The Shocking Development Process That's Still Being Talked About Because of a Few Trolls.JPG
πŸ‘€ PPAOE πŸ“… 2026.10.20 πŸ‘€ Views 1 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
Final Leak of the Standard iPhone 18
πŸ‘€ Maodun πŸ“… 2026.10.20 πŸ‘€ Views 2 πŸ‘ Likes 0
팁/정보
No Image
When the "Submit Comment" Button Stops Working: Handling Fetch Errors and Preventing Duplicate Submissions
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.19 πŸ‘€ Views 8 πŸ‘ Likes 0
개발
Thumbnail
Where do indie game developers get their funding?
πŸ‘€ K_Shit πŸ“… 2026.10.18 πŸ‘€ Views 0 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
The iPhone Duo: Why the Hype Over Nano-Textures Is Absurd
πŸ‘€ Maodun πŸ“… 2026.10.16 πŸ‘€ Views 0 πŸ‘ Likes 0
자유
No Image
When You Are Logged Out After Logging In: Steps to Check the Domain, Path, and Secure Attributes of Cookies
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.16 πŸ‘€ Views 6 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
The mystery of the dozens of smartphones found in a Daegu motel room.....jpg
πŸ‘€ 야리타 πŸ“… 2026.10.15 πŸ‘€ Views 0 πŸ‘ Likes 0
자유
No Image
EXIF to Check Before Uploading Photos: Check for Missing Shooting Information and Rotation Issues
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.12 πŸ‘€ Views 4 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
A Roundup of the "Panel" Rumors That Have Been Settled on iPhoneGall
πŸ‘€ K_Shit πŸ“… 2026.10.12 πŸ‘€ Views 1 πŸ‘ Likes 0
팁/정보
No Image
When There Is a 9-Hour Difference in Server Log Times: How to Accurately Synchronize UTC and Korean Time
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.11 πŸ‘€ Views 9 πŸ‘ Likes 0
개발
No Image
Development Log #9 - Improved Pixel Shaders and the Navy
πŸ‘€ 루루웨도 πŸ“… 2026.10.11 πŸ‘€ Views 3 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
iPhone 18 Pro: Overheating and Battery Issues Resolved, But… The 1.99 Million Won Hurdle
πŸ‘€ Maodun πŸ“… 2026.10.11 πŸ‘€ Views 2 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
Fake Buldak: It's Immediately Exposed When You See It on a Smartphone
πŸ‘€ 루루웨도 πŸ“… 2026.10.10 πŸ‘€ Views 1 πŸ‘ Likes 0
팁/정보
No Image
When Forum Page Loads Are Slow: Checking Index Effectiveness Using SQLite Execution Plans
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.10 πŸ‘€ Views 11 πŸ‘ Likes 0
팁/정보
No Image
When pip says a module is missing after installation: Checking the Python virtual environment and execution path
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.09 πŸ‘€ Views 5 πŸ‘ Likes 0
팁/정보
No Image
When files keep getting pushed even though you've added them to .gitignore: Steps to check Git tracking status
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.08 πŸ‘€ Views 6 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
Samsung... Cuts Smartphone Productionβ€”Wow... News
πŸ‘€ PPAOE πŸ“… 2026.10.08 πŸ‘€ Views 1 πŸ‘ Likes 0
팁/정보
No Image
Verifying That Downloaded Files Are Identical: SHA-256 Integrity Checks and Their Limitations
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.07 πŸ‘€ Views 12 πŸ‘ Likes 0
팁/정보
No Image
When Korean Text in CSV Files Appears Garbled: How to Check Encoding, Commas, and Leading Zeros Separately
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.06 πŸ‘€ Views 8 πŸ‘ Likes 0
개발
Thumbnail
Fun development anecdotes posted in the "Development Anecdotes" thread
πŸ‘€ 바루데여 πŸ“… 2026.10.06 πŸ‘€ Views 0 πŸ‘ Likes 0
개발
No Image
When a Website Won't Load: A Practical Guide to Distinguishing Between HTTP 403, 404, 429, 500, and 503 Errors
πŸ‘€ μΈμŠ€ν”Ό πŸ“… 2026.10.05 πŸ‘€ Views 7 πŸ‘ Likes 0
λ‰΄μŠ€
Thumbnail
The Truth Behind "Why Is There Toilet Paper in Front of the Computer?"
πŸ‘€ Maodun πŸ“… 2026.10.05 πŸ‘€ Views 2 πŸ‘ Likes 0
1 2 3 4 5 6 7 Next › Last »
✏️ Write