MySQL ¾²¸é¼ ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í 17°¡Áö
*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