MYSQL
HOME > DB > MYSQL
2018.09.30 / 22:42

MySQL ¾²¸é¼­ ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í 17°¡Áö

GAScripter
Ãßõ ¼ö 166

*MySQL ¾²¸é¼­ ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í 17°¡Áö*

±ÇÀå»çÇ×ÀÌ´Ù. ÀÌ°ÍÀ» ÀÌÇØÇÏ¸é ´ç½ÅÀÇ ¾îÇø®ÄÉÀ̼ÇÀÌ ´õ ³ªÀº ¼º´ÉÀ» ¹ßÈÖÇÒ °ÍÀÌ´Ù.

´Ù¸¸ ÀÌ°ÍÀÌ »ç¶÷ÀÇ ½Ç·ÂÀ» ÆÇ´ÜÇϴ ôµµ·Î »ç¿ëµÇ¼­´Â ¾È µÉ °ÍÀÌ´Ù.

 

ÀÛ°Ô »ý°¢Çϱâ

- Á¶¸¸°£ ±Ô¸ð°¡ Ä¿Áú°Å¶ó¸é MySQL ecosystemÀ» ºÁ¾ßµÈ´Ù.
- ±×¸®°í ij½Ì ºý½Ã°Ô ¾È ÇÏ´Â ¸ÞÀÌÀú À¥»çÀÌÆ®´Â ¾ø´Ù.
- develooper.comÀÇ Hansen PT¶û Ilia Æ©Å丮¾ó º¼ °Í
- óÀ½ºÎÅÍ È®Àå °¡´ÉÇÏ°Ô ¾ÆÅ°ÅØó Àß ÂÉ°³³ö¾ßµÈ´Ù.
- º¹Á¦¶û ÆÄƼ¼Å´× ¾î¶»°Ô ÇÒÁö ¹Ì¸® °èȹ ¼¼¿ö³ö¶ó.
- ÆÄÀÏ ±â¹Ý ¼¼¼Ç Á» ¾²Áö¸¶ -_-
- ±×·¸´Ù°í ³Ê¹« ¾µµ¥¾øÀÌ Å©°Ô »ý°¢ÇÏÁöµµ ¸» °Í
- ƯÈ÷ ¼º´ÉÇÏ°í È®À强 ±¸ºÐ ¸ø ÇÏ¸é ³­°¨ÇÔ

 

EXPLAIN ¾È ½áº¸±â

- SELECT ¾Õ¿¡ EXPLAIN À̶ó°í ºÙÀ̱⸸ ÇÏ¸é µÇ´Â °ÍÀ» (..)
- ½ÇÇà °èȹ È®ÀÎ
- ŸÀÔ Ä÷³¿¡ index ½áÀִ°Ŷû Extra Ä÷³¿¡ index ½áÀִ°Ŷû ¡°¸Å¿ì Å«¡± Â÷ÀÌ ÀÖÀ½
* ŸÀÔ¿¡ ÀÖÀ¸¸é Full À妽º ½ºÄµ (¾È ÁÁ´Ù.)
* Extra Ä÷³¿¡ ÀÖÀ¸¸é Covering À妽º ã¾Ò´Ù´Â ÀǹÌÀÓ (ÁÁ´Ù!)
- 5.0 ÀÌÈĺÎÅÍ´Â index_merge ÃÖÀûÈ­µµ ÇÑ´Ù.

 

À߸øµÈ µ¥ÀÌÅÍ Å¸ÀÔ ¼±ÅÃ

- ÇÑ ¸Þ¸ð¸® ºí·° ´ÜÀ§¿¡ À妽º ·¹Äڵ尡 ¸¹ÀÌ µé¾î°¥¼ö·Ï Äõ¸®°¡ »¡¸® ½ÇÇàµÉ °ÍÀÌ´Ù. (Áß¿ä)
- ¾Æ.. Á¤±ÔÈ­ Á» ÇØ -_-¡¦ (ÀÌ°Å Á¤¸» Ãæ°Ý°ú °øÆ÷ÀÎ µí)
- °¡Àå ÀÛÀº µ¥ÀÌÅÍ Å¸ÀÔÀ» ½á.. (ÁøÂ¥ BIGINT°¡ ÇÊ¿äÇϳİí..)
- À妽º °É¸®´Â Çʵå´Â Á¤¸» ÃÖ¼ÒÇÑÀ¸·Î µ¥ÀÌÅÍ Å©±â¸¦ ½á¾ßµÈ´Ù°í.
- IP´Â INT UNSIGNED·Î ÀúÀåÇØ!! (¾ÆÁÖ °ø°¨)
* ÀÌ·² ¶§ ¾²¶ó°í INET_ATON ÇÔ¼ö°¡ ¾Æ¿¹ ³»ÀåµÇ¾î ÀÖÀ½.

 

PHP¿¡¼­ pconnect ¾²´Â Áþ

- ¾ÆÆÄÄ¡¿¡¼­ Á»ºñ ÇÁ·Î¼¼½º¶óµµ »ý±â¸é ±× Ä¿³Ø¼ÇÀº ±×³É Áõ¹ßÇϴ°žß..
- ¾îÂ÷ÇÇ MySQL Á¢¼Ó ¼Óµµ´Â OracleÀ̳ª PostgreSQL º¸´Ù 10~100¹è ºü¸£´Ù°í.

³Ê¹« °úµµÇÑ DB Ãß»óÈ­ °èÃþÀ» µÎ´Â °Í
- ¾îµð Æ÷Æà ¿­½ÉÈ÷ ÇÒ °Å ¾Æ´Ï¸é Ãß»óÈ­ °èÃþ ¾²Áö¸¶ (ADODB, MDB2, PearDB µî)
- scale out °¡´ÉÇÑ°É ¾²¶ó°í.

 

½ºÅ丮Áö ¿£Áø ÀÌÇØ ¸ø ÇÏ´Â °Í

- ´ÜÀÏ ¿£Áø¸¸À¸·Î Àüü ¾ÆÅ°ÅØó¸¦ °áÁ¤Çß´Ù¸é ´ëºÎºÐ ÃÖÀûÀÌ ¾Æ´Ô
- ¿£Áø º° Àå´ÜÁ¡À» °øºÎÇÒ °Í
- ARCHIVE : zlibÀ¸·Î ¾ÐÃàÇØÁÖ°í UPDATE ¾È µÇ°í ·Î±× Bulk Insert¿¡ À¯¿ëÇÔ.
- MEMORY : ¼­¹ö Àç½ÃÀÛÇϸé Áõ¹ß. À妽º°¡ HASH³ª BTREE·Î °¡´ÉÇÔ. ÀÓ½Ã, ¿ä¾à µ¥ÀÌÅÍ¿¡ »ç¿ë.
* ÁÖ°£ top X Å×ÀÌºí °°Àº °Í.
* ÇÏ¿©Æ° ¸Þ¸ð¸®¿¡ ¹Ú¾Æ³Ö°í ½ÍÀº µ¥ÀÌÅÍ ÀÖÀ¸¸é..

 

À妽º ·¹À̾ƿô ÀÌÇØ ¸ø ÇÏ´Â °Í

- Á¦´ë·Î À妽º¶û ½ºÅ丮Áö ¿£Áø ¼±ÅÃÇÏ·Á¸é °øºÎ Á» ÇØ
- ¿£ÁøÀº µ¥ÀÌÅÍ¿Í À妽º ·¹Äڵ带 ¸Þ¸ð¸®³ª µð½ºÅ©¿¡ ·¹À̾ƿôÇÏ´Â °É ±¸ÇöÇÑ °Í
- clustered ±¸¼ºÀº µ¥ÀÌÅ͸¦ PK ¼ø¼­¿¡ µû¶ó ÀúÀåÇÔ.
- non-clustered ±¸¼ºÀº À妽º¸¸ ¼ø¼­´ë·Î ÀúÀåÇÏ°í µ¥ÀÌÅÍ´Â ¼ø¼­ °¡Á¤ÇÏÁö ¾ÊÀ½.
- clustered¿¡¼­´Â À妽º¸¸ Ÿ¸é Ãß°¡ÀûÀÎ Á¶È¸ ¾øÀÌ ¹Ù·Î µ¥ÀÌÅÍ °¡Á®¿À´Â °ÍÀÓ.
- ±×·¡¼­ clustered PK´Â ÀÛÀº ³ðÀ¸·Î ÇÒ ÇÊ¿ä°¡ Àִٴ°Å
* ´Ù¸¥ À妽º´Â °¢ ·¹Äڵ帶´Ù PK¸¦ ¾Õ¿¡ ´õ ºÙÀÌ°Ô µÇ´Ï±î.
* PK ÁöÁ¤ ¾È ÇÏ¸é ¾Æ¹«·¸°Ô³ª Çعö¸²

 

Äõ¸® ij½Ã ÀÌÇØ ¸ø ÇÏ´Â °Í

- ¾îÇø®ÄÉÀÌ¼Ç read/write ºñÀ²Àº ¾Ë°í ÀÖ¾î¾ßÁö
- Äõ¸® ij½Ã ¼³°è´Â CPU »ç¿ë°ú Àб⠼º´É °£ÀÇ Å¸Çù
- Äõ¸® ij½Ã Å©±â¸¦ ´Ã¸°´Ù°í Àб⠼º´ÉÀÌ ÁÁ¾ÆÁö´Â°Ô ¾Æ´Ô. heavy read¶óµµ ¸¶Âù°¡Áö.
- °úµµÇÑ CPU »ç¿ëÀ» ¸·±â À§ÇØ ¹«È¿È­ ÇÒ ¶§´Â ij½Ã Ç׸ñµéÀ» ¹¶ÅÖÀÌ·Î ³¯·Á¹ö¸²
- ÇѸ¶µð·Î SELECT°¡ ÂüÁ¶ÇÏ´Â Å×ÀÌºí µ¥ÀÌÅÍ Çϳª¶óµµ º¯°æµÇ¸é ±× Å×À̺í ij½Ã´Â ´Ù ³¯¶ó°£´Ù´Â ¾ê±âÀÓ
- ¼öÁ÷ Å×À̺í ÆÄƼ¼Å´×À¸·Î ó¹æ
* Product¿Í ProductCount¸¦ ÂÉ°µ´ÙµçÁö..
* ÀÚÁÖ º¯ÇÏ´Â °Í°ú º¯ÇÏÁö ¾Ê´Â °ÍÀ» ÂÉ°³´Â°Ô Áß¿äÇÏ´Ù ÀÌ ¸»ÀÓ.

 

Stored Procedure¸¦ ¾²´Â °Í

- ¹«Á¶°Ç ¾²¸é ¾È µÈ´Ù´Â°Ô ¾Æ´Ï°í..
- ÄÄÆÄÀÏ ÇÒ ¶§ ¹«½¼ ÀÏÀÌ ÀϾ´ÂÁö ÀÌÇØ ¸ø ÇÏ°í ¾²¸é Àç¾ÓÀÌ µÈ´Ù ÀÌ ¸».
- ´Ù¸¥ RDBMS¶û ´Ù¸£°Ô connection thread¿¡¼­ ½ÇÇà °èȹÀÌ ¼¼¿öÁü.
- ÀÌ°Ô ¹º ¾ê±â³Ä ÇÏ¸é µ¥ÀÌÅÍ ÇÑ ¹ø °¡Á®¿À°í ¿¬°á ²÷À¸¸é ±×³É CPU ³¶ºñ (7~8% Á¤µµ)ÇÏ´Â ²ÃÀ̶ó´Â °Í.
- À¢¸¸Çϸé Prepared ±¸¹®°ú Dynamic SQLÀ» ½á¶ó.. ¾Æ·¡ °æ¿ì¸¦ Á¦¿ÜÇÏ°í
* ETL ŸÀÔ ÇÁ·Î½ÃÀú
* ¾ÆÁÖ¾ÆÁÖ º¹ÀâÇÏÁö¸¸ ÀÚÁÖ ½ÇÇàµÇÁö´Â ¾Ê´Â °Í
* ÇÑ ¹ø ¿äûÇÒ ¶§¸¶´Ù ¿©·¯¹ø ½ÇÇàµÇ´Â °£´ÜÇÑ °Í (¿¬°áÇÑ »óÅ·Π¿©·¯¹ø ½á¾ß µÈ´Ù´Ï±î)

 

À妽º Ä÷³¿¡ ÇÔ¼ö ¾²´Â °Í

- ÇÔ¼ö¿¡ À妽º Ä÷³ ³Ö¾î È£ÃâÇÏ¸é ´ç¿¬È÷ À妽º ¸ø ź´Ù
- ÇÔ¼ö¸¦ ¸ÕÀú °è»êÇؼ­ »ó¼ö·Î ¸¸µç ´ÙÀ½¿¡ = ·Î ¿¬°áÇØ¾ß À妽º Å» ¼ö ÀÖ´Ù.
* ¿©±â ½ÇÇà °èȹ º¸¸é LIKEµµ range type À妽º Ÿ´Â °Í º¸ÀÓ

 

À妽º »©¸Ô°Å³ª ¾µ¸ð¾ø´Â À妽º ¸¸µé¾î ³õ´Â °Í

- À妽º ºÐÆ÷µµ(selectivity)°¡ ÇãÁ¢ÇÏ¸é ¾È ¾´´Ù.
- S = d/n
* d = ¼­·Î ´Ù¸¥ °ªÀÇ ¼ö (# of distinct values)
* n = Å×À̺íÀÇ Àüü ·¹ÄÚµå ¼ö
- ¾µ¸ð¾ø´Â À妽º´Â INSERT/UPDATE/DELETE¸¦ ´À¸®°Ô ÇÒ »Ó..
- FK´Â ¹«Á¶°Ç À妽º °É¾î¶ó. (¹°·Ð FK Á¦¾à °É¸é À妽º ÀÚµ¿À¸·Î »ý±ä´Ù.)
- WHERE³ª GROUP BY Ç¥Çö½Ä¿¡¼­ ¾²ÀÌ´Â Ä÷³Àº À妽º Ãß°¡¸¦ °í·ÁÇÒ °Í
- covering index »ç¿ëÀ» °í·ÁÇÒ °Í
- À妽º Ä÷³ ¼ø¼­¿¡ À¯ÀÇÇÒ °Í!

 

join ¾È ¾²´Â Áþ

- ¼­ºêÄõ¸®´Â joinÀ¸·Î ÀçÀÛ¼ºÇضó
- Ä¿¼­ Á¦°ÅÇضó
- ÁÁÀº Mysql ¼º´ÉÀ» ³»·Á¸é ±âº»
- ÁýÇÕ ±â¹ÝÀ¸·Î »ý°¢ÇؾßÁö ·çÇÁ µ¹¸®´Â°Å »ý°¢ÇÏ¸é ¾È µÈ´Ù.

 

Deep Scan °í·ÁÇÏÁö ¾Ê´Â °Í

- °Ë»ö¿£Áø Å©·¯¿ï·¯°¡ ¾µ°í Áö³ª°¥ ¼ö ÀÖ´Ù.
- ÀÌ °æ¿ì °è¼ÓÇؼ­ Àüü ÁýÇÕÀ» Á¤·ÄÇÑ ´ÙÀ½ LIMIT·Î °¡Á®¿Í¾ß ÇÏ´Ï ¹«ÁøÀå ´À·ÁÁø´Ù.
- ¾î¶»°Ôµç ÁýÇÕÀ» ÀÛ°Ô ÁÙÀÎ ´ÙÀ½ °Å±â¼­ LIMIT °É¾î °¡Á®¿Ã °Í

 

InnoDB Å×ÀÌºí¿¡¼­ WHERE Á¶°ÇÀý ¾øÀÌ SELECT COUNT(*) ÇÏ´Â Áþ

- InnoDB Å×ÀÌºí¿¡¼­´Â Á¶°ÇÀý ¾øÀÌ COUNT(*) ÇÏ´Â°Ô ´À¸®´Ù.
- °¢ ·¹ÄÚµåÀÇ transaction isolationÀ» À¯ÁöÇÏ´Â MVCC ±¸ÇöÀÌ º¹ÀâÇؼ­ ±×·¸´Ù´Â..
- Æ®¸®°Å °É¾î¼­ ¸Þ¸ð¸® ½ºÅ丮Áö ¿£Áø ¾²´Â Å×ÀÌºí¿¡ Åë°è¸¦ º°µµ·Î À¯ÁöÇÏ¸é µÈ´Ù.

 

ÇÁ·ÎÆÄÀϸµÀ̳ª º¥Ä¡¸¶Å· ¾È ÇÏ´Â °Í

- ÇÁ·ÎÆÄÀϸµ : º´¸ñ ã¾Æ³»±â
- º¥Ä¡¸¶Å· : ½Ã°£¿¡ µû¸¥ ¼º´É º¯È­ ÃßÀÌ Æò°¡, ºÎÇÏ °ßµô ¼ö ÀÖ´ÂÁö Å×½ºÆ®
- ÇÁ·ÎÆÄÀϸµ ÇÒ ¶§´Â ½ÇÁ¦ µ¥ÀÌÅ͸¦ ¿Å°Ü¿Í¼­ ÇÒ °Í
- ¾îµð°¡ º´¸ñÀ̳Ä~ Memory? Disk I/O? CPU? Network I/O? OS?
- ´À¸° Äõ¸® ·Î±×·Î ³²±â±â
* log_slow_queries=/path/to/log
* log_queries_not_using_indexes
- º¥Ä¡¸¶Å· ½Ã¿¡´Â ´Ù °íÁ¤½ÃÅ°°í º¯¼ö Çϳª¸¸ ¹Ù²ã°¡¸é¼­ ÇØ¾ß ÇÔ. (Äõ¸® ij½Ã´Â ²ø °Í.)
- µµ±¸¸¦ ½á¶ó~~
* EXPLAIN
* SHOW PROFILE
* MyTop/innotop
* mysqlslap
* MyBench
* ApacheBench (ab)
* super-smack
* SysBench
* JMeter/Ant
* Slow Query Log

 

AUTO_INCREMENT ¾È ¾²´Â °Í

- PK¸¦ AUTO_INCREMENT·Î ¾²´Â°Ç ¹«ÁøÀå ÃÖÀûÈ­ µÇ¾î ÀÖÀ½
* °í¼Ó º´Çà INSERT °¡´É
* Àá±Ý ¾È °É¸®°í ÀÐÀ¸¸é¼­ °è¼Ó ÇÒ ¼ö ÀÖ´Ù´Â!
- »õ ·¹Äڵ带 ±Ùó¿¡ ³õÀ½À¸·Î½á µð½ºÅ©¿Í ÆäÀÌÁö ´ÜÆíÈ­¸¦ ÁÙÀÓ
- ¸Þ¸ð¸®¿Í µð½ºÅ©¿¡ ÇÖ ½ºÆÌÀ» »ý¼ºÇÏ°í ½º¿ÍÇÎÀ» ÁÙÀÓ

 

ON DUPLICATE KEY UPDATE¸¦ ¾È ¾²´Â °Í

- ·¹Äڵ尡 ÀÖÀ¸¸é ¾÷µ¥ÀÌÆ®ÇÏ°í ¾øÀ¸¸é Àμ­Æ®ÇÏ°í ÀÌ·± ÄÚµå ÇÊ¿ä¾ø´Ù!! ´Ù ³¯·Á¹ö·Á¶ó!!
- ¼­¹ö¿¡ ºÒÇÊ¿äÇÏ°Ô ¿Ô´Ù°¬´Ù ÇÒ ÇÊ¿ä°¡ ¾ø¾îÁü
- 5-6% Á¤µµ ºü¸§
- µ¥ÀÌÅÍ ÀÔ·ÂÀÌ ¸¹´Ù¸é ´õ Ä¿Áú ¼ö ÀÖÀ½
ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í ÃÑÁ¤¸®
Thinking too small
Not using EXPLAIN
Choosing the wrong data types
Using persistent connections in PHP
Using a heavy DB abstraction layer
Not understanding storage engines
Not understanding index layouts
Not understanding how the query cache works
Using stored procedures improperly
Operating on an indexed column with a function
Having missing or useless indexes
Not being a join-fu master
Not accounting for deep scans
Doing SELECT COUNT(*) without WHERE on an InnoDB table
Not profiling or benchmarking
Not using AUTO_INCREMENT
Not using ON DUPLICATE KEY UPDATEK