ȸ¿ø·Î±×ÀÎ
µ¥ÀÌÅͺ£À̽º ÃÖÀûÈ¿Í Äõ¸® È¿À²¼ºÀ» ³ôÀÌ °Ë»ö ¼º´ÉÀ» °³¼±ÇÏ´Â ¹æ¹ý
5´Þ Àü
°Ë»ö ¼º´ÉÀ» °³¼±ÇÏ´Â ¹æ¹ýÀº µ¥ÀÌÅͺ£À̽º ÃÖÀûÈ¿Í Äõ¸® È¿À²¼ºÀ» ³ôÀÌ´Â °ÍÀÔ´Ï´Ù.
´ÙÀ½Àº °Ë»ö ¼Óµµ¸¦ °³¼±ÇÒ ¼ö ÀÖ´Â ¸î °¡Áö ¹æ¹ýÀÔ´Ï´Ù.
1. Á¤±ÔÈµÈ °Ë»ö¾î¸¦ ¹Ì¸® ÀúÀåÇÏ°í À妽º »ý¼ºÇϱâ
ÇöÀç Äõ¸®´Â REPLACE ÇÔ¼ö·Î Ư¼ö¹®ÀÚ¸¦ Á¦°ÅÇÏ°í °ø¹éÀ» ¾ø¾Ö¼ °Ë»öÀ» ¼öÇàÇÏ°í ÀÖ½À´Ï´Ù. ´ë½Å, Ư¼ö¹®ÀÚ¿Í °ø¹éÀÌ Á¦°ÅµÈ Á¤±ÔÈµÈ °Ë»ö¾î¸¦ µ¥ÀÌÅͺ£À̽º¿¡ ¹Ì¸® ÀúÀåÇÏ°í, ÀÌ Ä÷³¿¡ À妽º¸¦ ¼³Á¤ÇÏ¿© °Ë»ö ¼Óµµ¸¦ °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿¹½Ã: TABLE mp3 sub(Á¦¸ñÄ÷³)
Å×ÀÌºí¿¡ »õ·Î¿î Ä÷³ sub_normalized Ãß°¡
ALTER TABLE mp3 ADD COLUMN sub_normalized VARCHAR(255);
¸ðµç Çà¿¡ ´ëÇØ Á¤±ÔÈµÈ Á¦¸ñÀ» Ãß°¡
UPDATE mp3 SET sub_normalized = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(sub, ' ', ''), '-', ''), '_', ''), '!', ''), '@', '');
À妽º¸¦ Ãß°¡ÇÏ¿© °Ë»öÀ» ºü¸£°Ô
CREATE INDEX idx_sub_normalized ON mp3(sub_normalized);
Äõ¸®¸¦ º¯°æÇÏ¿© sub_normalized Ä÷³¿¡¼ °Ë»ö
$search_condition = "WHERE sub_normalized LIKE '%$search_normalized%'";
ÀÌ·¸°Ô ÇÏ¸é °Ë»ö ½Ã ¸Å¹ø REPLACE ÇÔ¼ö·Î ¹®ÀÚ¿À» º¯È¯ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç, À妽º ´öºÐ¿¡ °Ë»ö ¼Óµµ°¡ ÈξÀ »¡¶óÁú ¼ö ÀÖ½À´Ï´Ù.
2. Full-Text À妽º »ç¿ëÇϱâ
¸¸¾à °Ë»ö Á¶°ÇÀÌ ´õ º¹ÀâÇϰųª Àüü ÅؽºÆ® °Ë»öÀÌ ÇÊ¿äÇÏ´Ù¸é, MySQLÀÇ FULLTEXT À妽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. LIKE Á¶°Çº¸´Ù´Â FULLTEXT À妽º¸¦ È°¿ëÇÑ °Ë»öÀÌ ÈξÀ ºü¸¦ ¼ö ÀÖ½À´Ï´Ù.
Å×ÀÌºí¿¡ FULLTEXT À妽º¸¦ Ãß°¡
ALTER TABLE mp3 ADD FULLTEXT(sub);
Äõ¸®¸¦ LIKE ´ë½Å MATCH¸¦ »ç¿ëÇØ º¯°æ
$search_condition = "WHERE MATCH(sub) AGAINST('$search_normalized' IN BOOLEAN MODE)";
ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é ´ë·®ÀÇ ÅؽºÆ® µ¥ÀÌÅ͸¦ ºü¸£°Ô °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù.
´Ù¸¸, FULLTEXT À妽º´Â ¸Å¿ì ªÀº ´Ü¾î³ª Ư¼ö¹®ÀÚ °Ë»ö¿¡´Â ÀûÇÕÇÏÁö ¾ÊÀ¸¹Ç·Î °Ë»ö ¿ä±¸ »çÇ׿¡ ¸Â°Ô Á¶Á¤ÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ½À´Ï´Ù.
FULLTEXT À妽º¿¡¼ 2±ÛÀÚ±îÁö °Ë»öÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤ÇÏ·Á¸é, MySQL ¶Ç´Â MariaDBÀÇ ¼³Á¤ ÆÄÀÏ (my.cnf ¶Ç´Â my.ini)¿¡ ´ÙÀ½ ¿É¼ÇÀ» Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.
ft_min_word_len (MySQL) ¶Ç´Â innodb_ft_min_token_size (InnoDB¿¡¼ »ç¿ëÇÏ´Â °æ¿ì)
ft_min_word_len: MyISAM ¿£Áø¿¡¼ »ç¿ëÇÏ´Â ÃÖ¼Ò °Ë»ö ´Ü¾î ±æÀ̸¦ ¼³Á¤ÇÕ´Ï´Ù.
innodb_ft_min_token_size: InnoDB ¿£Áø¿¡¼ »ç¿ëÇÏ´Â ÃÖ¼Ò °Ë»ö ÅäÅ« Å©±â¸¦ ¼³Á¤ÇÕ´Ï´Ù.
¸ÕÀú my.ini ÆÄÀÏ¿¡ ¾Æ·¡¿Í °°Àº ¼³Á¤À» Ãß°¡Çϼ¼¿ä.
[mysqld]
ft_min_word_len=2
innodb_ft_min_token_size=2
¼³Á¤À» º¯°æÇÑ ÈÄ¿¡´Â MySQL/MariaDB ¼¹ö¸¦ Àç½ÃÀÛÇØ¾ß ÇÕ´Ï´Ù.
sudo service mysql restart # ¸®´ª½º
# ¶Ç´Â
net stop mysql
net start mysql # À©µµ¿ì
±×¸®°í ³ª¼, ±âÁ¸ FULLTEXT À妽º¸¦ Àç»ý¼ºÇØ¾ß ÇÕ´Ï´Ù. ÀÌ¹Ì À妽º¸¦ Ãß°¡ÇÑ °æ¿ì, À妽º¸¦ µå·ÓÇÏ°í ´Ù½Ã »ý¼ºÇϼ¼¿ä.
ALTER TABLE mp3 DROP INDEX sub;
ALTER TABLE mp3 ADD FULLTEXT(sub);
ÀÌÁ¦ 2±ÛÀÚ ´Ü¾îµµ °Ë»öÀÌ °¡´ÉÇÕ´Ï´Ù.
3. LIMIT°ú OFFSET ÃÖÀûÈ
LIMIT°ú OFFSETÀ» »ç¿ëÇÑ ÆäÀÌ¡Àº ±âº»ÀûÀ¸·Î ¼º´É¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ OFFSET °ªÀÌ Å¬¼ö·Ï ¼º´É ÀúÇÏ°¡ ½ÉÇØÁú ¼ö ÀÖ½À´Ï´Ù. À̸¦ °³¼±ÇÏ·Á¸é À妽º ±â¹Ý ÆäÀÌ¡À» »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, id Ä÷³À» ±âÁØÀ¸·Î ÆäÀÌ¡À» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù
$last_id = isset($_GET['last_id']) ? intval($_GET['last_id']) : 0;
if ($last_id > 0) {
$sql = "SELECT id, sub, suburl FROM mp3 $search_condition AND id < $last_id ORDER BY id DESC LIMIT $items_per_page";
} else {
$sql = "SELECT id, sub, suburl FROM mp3 $search_condition ORDER BY id DESC LIMIT $items_per_page";
}
ÀÌ ¹æ¹ýÀº ÆäÀÌÁö´ç Ç׸ñÀ» ºÒ·¯¿Ã ¶§ OFFSET ´ë½Å ¸¶Áö¸·À¸·Î ºÒ·¯¿Â id¸¦ ±âÁØÀ¸·Î °Ë»öÇϹǷΠ¼º´ÉÀÌ °³¼±µÉ ¼ö ÀÖ½À´Ï´Ù.
4. ij½Ì µµÀÔ
°Ë»ö¾î°¡ ÀÚÁÖ ¹Ýº¹µÇ´Â °æ¿ì, °Ë»ö °á°ú¸¦ ij½ÃÇÏ¿© µ¿ÀÏÇÑ °Ë»ö¾î¿¡ ´ëÇØ µ¥ÀÌÅͺ£À̽º¿¡ ´Ù½Ã Äõ¸®ÇÏÁö ¾Êµµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, Redis³ª Memcached¿Í °°Àº Àθ޸𸮠ij½Ã ½Ã½ºÅÛÀ» »ç¿ëÇÏ¿© °Ë»ö °á°ú¸¦ ÀÏÁ¤ ½Ã°£ µ¿¾È ÀúÀåÇÏ°í, µ¿ÀÏÇÑ °Ë»ö¾î¿¡ ´ëÇØ Ä³½ÃµÈ °á°ú¸¦ ¹ÝȯÇÏ´Â ¹æ½ÄÀ¸·Î ¼º´ÉÀ» Å©°Ô °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù.
5. µ¥ÀÌÅͺ£À̽º ¼¹ö Æ©´×
µ¥ÀÌÅͺ£À̽º ÀÚüÀÇ ¼º´ÉÀ» Çâ»ó½ÃÅ°±â À§ÇØ MySQL/MariaDB ¼¹ö ¼³Á¤À» ÃÖÀûÈÇÏ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. µ¥ÀÌÅͺ£À̽º Æ©´×Àº innodb_buffer_pool_size, query_cache_size, tmp_table_size µîÀÇ ¼³Á¤À» Á¶Á¤ÇÏ¿© ´ë±Ô¸ð µ¥ÀÌÅÍ¿¡ ´ëÇÑ Äõ¸® ¼º´ÉÀ» °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿ä¾à
1.Á¤±ÔÈµÈ °Ë»ö¾î¸¦ ¹Ì¸® ÀúÀåÇÏ°í À妽º¸¦ Ãß°¡.
2.FULLTEXT À妽º¸¦ »ç¿ëÇØ ºü¸¥ °Ë»ö ¼öÇà.
3.OFFSET ´ë½Å À妽º ±â¹Ý ÆäÀÌ¡À» »ç¿ëÇÏ¿© ¼º´É Çâ»ó.
4.°Ë»ö °á°ú ij½Ã¸¦ µµÀÔÇØ ¹Ýº¹ÀûÀÎ °Ë»ö ¿äû¿¡ ´ëÇØ ÀÀ´ä ¼Óµµ¸¦ ³ôÀ̱â.
5.µ¥ÀÌÅͺ£À̽º ¼¹ö Æ©´×À» ÅëÇØ ÀüüÀûÀÎ ¼º´É ÃÖÀûÈ.
ÀÌ·¯ÇÑ ¹æ¹ýµéÀ» Àû¿ëÇϸé 100¸¸ °Ç ÀÌ»óÀÇ µ¥ÀÌÅ͸¦ °Ë»öÇÒ ¶§ ¼º´ÉÀ» Å©°Ô °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Á¤±ÔÈµÈ °Ë»ö¾î¿Í À妽º¿Í FULLTEXT À妽º¸¦ µ¿½Ã¿¡ Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÇÏÁö¸¸ FULLTEXT À妽º¸¦ »ç¿ëÇÒ °æ¿ì,
ÀÌ¹Ì 1¹ø¿¡¼ Á¦¾ÈÇÑ ´ë·Î Ư¼ö¹®ÀÚ¿Í °ø¹éÀ» Á¦°ÅÇÑ sub_normalized Ä÷³À» ´ë»óÀ¸·Î FULLTEXT À妽º¸¦ Ãß°¡ÇÒ ¼ö ¾ø½À´Ï´Ù.
´ë½Å, ¿øº» ÅؽºÆ®ÀÎ sub Ä÷³¿¡ ´ëÇØ FULLTEXT À妽º¸¦ Àû¿ëÇØ¾ß ÇÕ´Ï´Ù.
¾Æ·¡¿¡¼ Á¤±ÔÈµÈ °Ë»ö¾î ¹æ½Ä°ú FULLTEXT °Ë»öÀ» ÇÔ²² Àû¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ°Ú½À´Ï´Ù.
1. Á¤±ÔÈµÈ °Ë»ö¾î¿Í FULLTEXT À妽º Àû¿ë ¹æ¹ý
1.1 FULLTEXT À妽º Ãß°¡
sub Ä÷³¿¡ FULLTEXT À妽º¸¦ Ãß°¡ÇÏ·Á¸é ¾Æ·¡¿Í °°Àº SQL ¸í·É¾î¸¦ »ç¿ëÇÕ´Ï´Ù
ALTER TABLE mp3 ADD FULLTEXT(sub);
1.2 FULLTEXT °Ë»öÀ» »ç¿ëÇÑ Äõ¸®
Á¤±ÔÈµÈ °Ë»ö¾î¸¦ ó¸®ÇÏ¸é¼ FULLTEXT °Ë»öÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. FULLTEXT À妽º´Â °ø¹éÀ̳ª Ư¼ö¹®ÀÚ¸¦ ¹«½ÃÇÏ´Â ±â´ÉÀÌ ÀÖ¾î, Á¤±ÔÈ °úÁ¤ ¾øÀ̵µ ÃæºÐÈ÷ ¼º´ÉÀ» ³ôÀÏ ¼ö ÀÖ½À´Ï´Ù.
Äõ¸®¸¦ ´ÙÀ½°ú °°ÀÌ º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.
if ($search) {
$search_condition = "WHERE MATCH(sub) AGAINST('$search_normalized' IN BOOLEAN MODE)";
}
¿©±â¼ AGAINST´Â MySQLÀÇ FULLTEXT °Ë»ö ¸Þ¼µåÀ̸ç, IN BOOLEAN MODE ¿É¼ÇÀ» »ç¿ëÇÏ¿© º¹ÀâÇÑ °Ë»öÀ» °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù. ÀÌ ¿É¼ÇÀº ´ÙÀ½°ú °°Àº °í±Þ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù:
+: ¹Ýµå½Ã Æ÷ÇԵǾî¾ß ÇÏ´Â ´Ü¾î.
-: Æ÷ÇԵǾ ¾È µÇ´Â ´Ü¾î.
*: ¿ÍÀϵåÄ«µå·Î Á¢µÎ»ç °Ë»ö.
¿¹¸¦ µé¾î, +hello -world´Â "hello"¸¦ ¹Ýµå½Ã Æ÷ÇÔÇÏ°í, "world"¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â °á°ú¸¦ ã½À´Ï´Ù.
2. FULLTEXT¿Í LIKE °Ë»öÀÇ Á¶ÇÕ
ƯÁ¤ »óȲ¿¡¼´Â FULLTEXT À妽º¸¦ »ç¿ëÇϵÇ, Ư¼ö¹®ÀÚ¿Í °ø¹éÀ» ó¸®ÇÑ Á¤±ÔÈµÈ °Ë»öÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ½À´Ï´Ù. À̶§ FULLTEXT °Ë»ö°ú Á¤±ÔÈµÈ °Ë»öÀ» Á¶ÇÕÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.
¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº ¹æ½ÄÀ¸·Î Á¶ÇÕÇÒ ¼ö ÀÖ½À´Ï´Ù.
if ($search) {
$search_condition = "WHERE MATCH(sub) AGAINST('$search_normalized' IN BOOLEAN MODE)
OR sub_normalized LIKE '%$search_normalized%'";
}
ÀÌ ¹æ½ÄÀº FULLTEXT °Ë»öÀÌ ºü¸£°Ô µ¿ÀÛÇϵÇ, Á¤±ÔÈµÈ °Ë»öµµ º¸Á¶ÀûÀ¸·Î µ¿ÀÛÇϵµ·Ï ÇÕ´Ï´Ù.
3. ÁÖÀÇ »çÇ×
FULLTEXT À妽º´Â MyISAM ¹× InnoDB ¿£Áø ¸ðµÎ¿¡¼ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸,
InnoDB¿¡¼ »ç¿ë ½Ã MySQL ¹öÀü¿¡ µû¶ó ±â´ÉÀÌ Á¶±Ý ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.
µû¶ó¼ »ç¿ëÇÏ´Â MySQL ¹öÀü¿¡¼ FULLTEXT °Ë»öÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇØ¾ß ÇÕ´Ï´Ù.
FULLTEXT °Ë»öÀº ¸Å¿ì À¯¿¬ÇÑ ¹Ý¸é, ¾ÆÁÖ ÂªÀº ´Ü¾î³ª ÀϹÝÀûÀÎ ´Ü¾î¿¡ ´ëÇؼ´Â Àß °Ë»öµÇÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ Á¡Àº ¹Ì¸® °í·ÁÇØ¾ß ÇÕ´Ï´Ù.
ÃÖÁ¾ ¿¹½Ã ÄÚµå
$conn = new mysqli($servername, $username, $password, $dbname);
// ¿¬°á È®ÀÎ
if ($conn->connect_error) {
die("¿¬°á ½ÇÆÐ: " . $conn->connect_error);
}
$items_per_page = 50; // ÆäÀÌÁö´ç Ç׸ñ ¼ö
$pages_to_show = 5; // Ç¥½ÃÇÒ ÆäÀÌÁö ¹øÈ£ °¹¼ö
// °Ë»ö¾î °¡Á®¿À±â ¹× Á¤±ÔÈ
$search = isset($_GET['search']) ? $_GET['search'] : '';
$search_normalized = preg_replace('/[^\p{L}\p{N}]/u', '', $search); // Ư¼ö¹®ÀÚ ¹× °ø¹é Á¦°Å
// ÆäÀÌÁö ¼³Á¤
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $items_per_page; // OFFSET °è»ê
// FULLTEXT¿Í LIKE Äõ¸® °áÇÕ
$search_condition = '';
if ($search) {
$search_condition = "WHERE MATCH(sub) AGAINST('$search_normalized' IN BOOLEAN MODE)
OR sub_normalized LIKE '%$search_normalized%'";
}
// ÃÑ µ¥ÀÌÅÍ ¼ö Á¶È¸
$total_sql = "SELECT COUNT(*) AS total FROM mp3 $search_condition";
$total_result = $conn->query($total_sql);
$total_row = $total_result->fetch_assoc();
$total_items = $total_row['total'];
$total_pages = ceil($total_items / $items_per_page); // ÃÑ ÆäÀÌÁö ¼ö
// ÆäÀÌÁöº° µ¥ÀÌÅÍ Á¶È¸ (¿ª¼øÀ¸·Î Á¤·Ä)
$sql = "SELECT id, sub, suburl FROM mp3 $search_condition ORDER BY id DESC LIMIT $items_per_page OFFSET $offset";
$result = $conn->query($sql);
// ÆäÀÌÁö ¹øÈ£ ¹üÀ§ ¼³Á¤
$start_page = max(1, $page - floor($pages_to_show / 2));
$end_page = min($total_pages, $start_page + $pages_to_show - 1);
°á·Ð
Á¤±ÔÈµÈ °Ë»ö¾î¸¦ À§ÇÑ º°µµÀÇ sub_normalized Ä÷³À» »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç,
ÀÌ Ä÷³¿¡ ´ëÇØ LIKE °Ë»öÀ» ¼öÇàÇÕ´Ï´Ù.
µ¿½Ã¿¡, ¿øº» sub Ä÷³¿¡ ´ëÇØ FULLTEXT À妽º¸¦ »ý¼ºÇÏ¿©,
¼º´ÉÀ» °³¼±Çϸ鼵µ °í±Þ °Ë»ö ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù.
ÀÌ µÎ ¹æ¹ýÀ» ÇÔ²² Àû¿ëÇϸé, °Ë»ö ¼Óµµ°¡ Å©°Ô °³¼±µÇ¸é¼µµ À¯¿¬ÇÑ °Ë»ö ±â´ÉÀ» À¯ÁöÇÒ ¼ö ÀÖ½À´Ï´Ù.
̵̧ : 5
̵̧
¸ñ·Ï