๐Ÿ“SQL ๊ธฐ๋ณธ ๋‹ค์ง€๊ธฐ(Transaction,View,Stored Procedure,Trigger,Index)

Umji Youยท2021๋…„ 8์›” 16์ผ

MySQL

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

๐Ÿ“10์ผ์ฐจ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹ค์Šต

1. ํŠธ๋žœ์žญ์…˜(Transaction)

Atomicํ•˜๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” SQL๋“ค์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ์ž‘์—…์ฒ˜๋Ÿผ
์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

ACID(Atomicity, Consistency, Isolation, Durability)์˜ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  • ์ด๋Š” DDL์ด๋‚˜ DML ์ค‘ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •/์ถ”๊ฐ€/์‚ญ์ œํ•œ ๊ฒƒ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ.
  • SELECT์—๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์Œ
  • BEGIN๊ณผ END ํ˜น์€ BEGIN๊ณผ COMMIT ์‚ฌ์ด์— ํ•ด๋‹น SQL๋“ค์„ ์‚ฌ์šฉ
  • ROLLBACK, COMMIT

์˜ˆ์‹œ) ATM์œผ๋กœ ๊ณ„์ขŒ์ด์ฒด๋ฅผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž

  1. A ์€ํ–‰์—์„œ ์ถœ๊ธˆํ•˜์—ฌ B์€ํ–‰์œผ๋กœ ์†ก๊ธˆํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
  2. ์†ก๊ธˆ ์ค‘, ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ A์€ํ–‰ ๊ณ„์ขŒ์—์„œ ๋ˆ์€ ๋น ์ ธ ๋‚˜๊ฐ”์ง€๋งŒ B์€ํ–‰์˜ ๊ณ„์ขŒ์— ์ž…๊ธˆ๋˜์ง€ ์•Š์•˜๋‹ค.
  3. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ์œ„ํ•ด ๊ฑฐ๋ž˜๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ชจ๋‘ ๋๋‚˜์•ผ ์ด๋ฅผ ์™„์ „ํ•œ ๊ฑฐ๋ž˜๋กœ ์Šน์ธํ•˜๊ณ , ๊ฑฐ๋ž˜ ๋„์ค‘ ๋ญ”๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ์ด ๊ฑฐ๋ž˜๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์—†์—ˆ๋˜ ๊ฑฐ๋ž˜๋กœ ์™„์ „ํžˆ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

    ์ด๋ ‡๊ฒŒ ๊ฑฐ๋ž˜์˜ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํŠธ๋žœ์žญ์…˜์ด๋‹ค.

    ๊ฐฑ์‹ , ์‚ญ์ œํ•˜๋Š”๋ฐ ์ฒ˜๋ฆฌ ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“  ์ž‘์—…์„ ์›์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๊ณ , ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ DB์— ๋ฐ˜์˜ํ•œ๋‹ค.

  • Commit(์ปค๋ฐ‹)

    • ๋ชจ๋“  ๋ถ€๋ถ„์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋ฉด ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•œ๊บผ๋ฒˆ์— DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • Rollback(๋กค๋ฐฑ)

    • ๋ถ€๋ถ„ ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ์ „์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.

    • ์ด๋•Œ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ทจ์†Œํ•˜์ง€ ์•Š๊ณ  ์ •ํ•ด์ง„ ๋ถ€๋ถ„๊นŒ์ง€๋งŒ ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์„๋•Œ savepoint๋ฅผ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

    • SAVEPOINT

      • ์ผ๋ฐ˜์ ์œผ๋กœ ROLLBACK์„ ๋ช…์‹œํ•˜๋ฉด INSERT, DELETE, UPDATE ๋“ฑ์˜ ์ž‘์—… ์ „์ฒด๊ฐ€ ์ทจ์†Œ๋˜์ง€๋งŒ,
      • SAVEPOINT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด๊ฐ€ ์•„๋‹Œ ํŠน์ • ๋ถ€๋ถ„์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ทจ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
      • ์ทจ์†Œํ•˜๋ ค๋Š” ์ง€์ ์„ SAVEPOINT๋กœ ๋ช…์‹œํ•œ๋’ค ROLLBACK TO ์„ธ์ด๋ธŒํฌ์ธํŠธ์ด๋ฆ„; ์„ ์‹คํ–‰ํ•˜๋ฉด ์ง€์ •ํ•œ ํ•ด๋‹น SAVEPOINT ์ง€์ ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ROLLBACK๋ฉ๋‹ˆ๋‹ค.
    • -- SAVEPOINT ์ง€์ •!
      SAVEPOINT ์„ธ์ด๋ธŒํฌ์ธํŠธ์ด๋ฆ„;
      
      -- SAVEPOINT๋กœ ๋กค๋ฐฑ!
      ROLLBACK TO ์„ธ์ด๋ธŒํฌ์ธํŠธ์ด๋ฆ„;
      

๐Ÿ’ก ํŠธ๋žœ์žญ์…˜(Transaction)์˜ ์—ฐ์‚ฐ๊ณผ์ •

image

SQL ๋ฌธ๋ฒ•

BEGIN; -- START TRANSACTION
 A์˜ ๊ณ„์ขŒ๋กœ๋ถ€ํ„ฐ ์ธ์ถœ;
 B์˜ ๊ณ„์ขŒ๋กœ ์ž…๊ธˆ;
END; -- COMMIT

-- โ— BEGIN๊ณผ START TRANSACTION์€ ๊ฐ™์€ ์˜๋ฏธ
-- โ— END์™€ COMMIT์€ ๋™์ผ
-- โ— ๋งŒ์ผ BEGIN ์ „์˜ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด ROLLBACK ์‹คํ–‰

โš ๏ธ์œ„์˜ ๋™์ž‘๋“ค์€ AUTOCOMMIT ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

AUTOCOMMIT : ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์— ๋Œ€ํ•œ SQL ์ž์ฒด๊ฐ€ ๋ฐ”๋กœ ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ autocommit ์ด ์•„๋‹Œ ์ƒํƒœ์—์„œ๋Š” ์—ฌ๋Ÿฌ์ค„์˜ ๋ช…๋ น์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์„์ˆ˜๊ฐ€ ์žˆ๋‹ค.

  • autocommit = TRUE

    • ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜์ •/์‚ญ์ œ/์ถ”๊ฐ€ ์ž‘์—…์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์—ฌ์ง. ์ด๋ฅผ ์ปค๋ฐ‹(Commit)๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๋งŒ์ผ ํŠน์ • ์ž‘์—…์„ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๊ณ  ์‹ถ๋‹ค๋ฉด BEGIN๊ณผ END(COMMIT)/ROLLBACK์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • autocommit = FALSE

    • ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜์ •/์‚ญ์ œ/์ถ”๊ฐ€ ์ž‘์—…์ด COMMIT์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ์ปค๋ฐ‹๋˜์ง€ ์•Š์Œ
    • ์ฆ‰, ๋ช…์‹œ์ ์œผ๋กœ ์ปค๋ฐ‹์„ ํ•ด์•ผํ•จ
    • ROLLBACK์ด ํ˜ธ์ถœ๋˜๋ฉด ์•ž์„œ ์ž‘์—…๋“ค์ด ๋ฌด์‹œ๋œ๋‹ค.
-- autocommit ๋ชจ๋“œ ํ™•์ธํ•˜๊ธฐ 
SHOW VARIABLES LIKE 'AUTOCOMMIT';

-- (ํ˜น์€ 1 = ON)์˜ ์‹คํ–‰์œผ๋กœ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ
SET autocommit=0  -- OFF

2. View

๋ทฐ(view)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” ์ผ์ข…์˜ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ทฐ๋Š” ์‹ค์ œ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ํ–‰๊ณผ ์—ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฆ„์ด ์žˆ๋Š” ์ฟผ๋ฆฌ๊ฐ€ View๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹จ์— ์ €์žฅ๋œ๋‹ค.

    • SELECT ๊ฒฐ๊ณผ๊ฐ€ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ View๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ๋งˆ๋‹ค SELECT๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

CREATE VIEW ๋ทฐ์ด๋ฆ„ AS
SELECT ํ•„๋“œ์ด๋ฆ„1, ํ•„๋“œ์ด๋ฆ„2, ...
FROM ํ…Œ์ด๋ธ”์ด๋ฆ„
WHERE ์กฐ๊ฑด
  • ์˜ˆ์‹œ
-- CREATE ๋ฌธ์— OR REPLACE ์ ˆ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ๋ทฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ทฐ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์— ์—†์œผ๋ฉด ๊ทธ๋ƒฅ create
CREATE OR REPLACE VIEW test.youji_session_details AS
SELECT s.id, s.user_id, s.created, s.channel_id, c.channel
FROM prod.session s
JOIN prod.channel c ON c.id = s.channel_id;

SELECT * FROM test.youji_session_details;

3. Stored Procedure, Trigger

1๏ธโƒฃ Stored Procedure

  • MySQL ์„œ๋ฒ„๋‹จ์— ์ €์žฅ๋˜๋Š” SQL ์ฟผ๋ฆฌ๋“ค
    • CREATE PROCEDURE ์‚ฌ์šฉ
    • DROP PROCEDURE [IF EXISTS]๋กœ ์ œ๊ฑฐ
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
  • ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์€ ๋ ˆ์ฝ”๋“œ๋“ค์˜ ์ง‘ํ•ฉ (SELECT์™€ ๋™์ผ)
  • ๊ฐ„๋‹จํ•œ ๋ถ„๊ธฐ๋ฌธ(if, case)๊ณผ ๋ฃจํ”„(loop)๋ฅผ ํ†ตํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€๋Šฅ
  • ๋””๋ฒ„๊น…์ด ํž˜๋“ค๊ณ  ์„œ๋ฒ„๋‹จ์˜ ๋ถ€ํ•˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ ๋‹ค๋Š” ๋‹จ์  ์กด์žฌ

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

-- ๋ฌธ๋ฒ• ์ •์˜
DELIMITER // -- $$๋„ ๊ฐ€๋Šฅ!
CREATE PROCEDURE stored_procedure_name(parameter_list)
BEGIN
 statements;
END //
DELIMITER ;

-- ํ˜ธ์ถœ ๋ฌธ๋ฒ•
CALL stored_procedure_name(argument_list);

ํ”„๋กœ์‹œ์ ธ ์‹ฌํ™” - IN ํŒŒ๋ผ๋ฏธํ„ฐ (ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋„˜๊ธด๋‹ค.)

DELIMITER //
CREATE PROCEDURE test.return_youji_session_details(IN channelName varchar(64))
BEGIN
   SELECT *
   FROM test.youji_session_details
   WHERE channel = channelName;
END //
DELIMITER ;

-- ํ˜ธ์ถœ 
CALL test.return_youji_session_details('Facebook');

ํ”„๋กœ์‹œ์ ธ ์‹ฌํ™” - INOUT ํŒŒ๋ผ๋ฏธํ„ฐ (ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋„˜๊ธฐ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.)

-- sql๋ฌธ
DELIMITER //
CREATE PROCEDURE test.return_youji_session_count(IN channelName varchar(64), INOUT totalRecord int)
BEGIN
   SELECT COUNT(1) INTO totalRecord FROM test.youji_session_details
   WHERE channel = channelName;
END //
DELIMITER ;

-- ํ˜ธ์ถœ
SET @facebook_count = 0;
CALL test.return_youji_session_count('Facebook', @facebook_count);
SELECT @facebook_count;
-- 14130 ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

2๏ธโƒฃStored Function

  • ๊ฐ’(Scalar)์„ ํ•˜๋‚˜ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์„œ๋ฒ„์ชฝ ํ•จ์ˆ˜ (ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ‘์—
    ๋“ฑ๋ก๋จ)
    • ๋ฆฌํ„ด๊ฐ’์€ Deterministic ํ˜น์€ Non Deterministic
    • ํ˜„์žฌ guest ๊ณ„์ •์œผ๋กœ๋Š” test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ‘์— ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋ชจ๋“  ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” IN ํŒŒ๋ผ๋ฏธํ„ฐ
  • SQL ์•ˆ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ: Stored Procedure์™€ ๊ฐ€์žฅ ๋‹ค๋ฅธ ์ฐจ์ด์ 
  • CREATE FUNCTION ์‚ฌ์šฉ

์˜ˆ์‹œ SQL

DELIMITER $$
CREATE FUNCTION test.Channel_Type(channel varchar(32))
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
 DECLARE channel_type VARCHAR(20);
 IF channel in ('Facebook', 'Instagram', 'Tiktok') THEN
 SET channel_type = 'Social Network';
 ELSEIF channel in ('Google', 'Naver') THEN
 SET channel_type = 'Search Engine';
 ELSE
 SET channel_type = channel;
 END IF;
-- return the customer level
RETURN (channel_type);
END$$ -- $$ ๋‚˜ // ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

-- ํ˜ธ์ถœ
SELECT channel, test.Channel_Type(channel)
FROM prod.channel;

3๏ธโƒฃTrigger

  • CREATE TRIGGER ๋ช…๋ น์„ ์‚ฌ์šฉ
  • INSERT/DELETE/UPDATE ์‹คํ–‰ ์ „ํ›„์— ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด
    ๊ฐ€๋Šฅ
    • ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ง€์ •์ด ํ•„์š”
  • NEW/OLD modifier
    • NEW๋Š” INSERT์™€ UPDATE์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
    • OLD๋Š” DELETE์™€ UPDATE์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

CREATE TRIGGER ํŠธ๋ฆฌ๊ฑฐ์ด๋ฆ„
{BEFORE | AFTER} {INSERT | UPDATE| DELETE } -- before/after์ค‘ ์–ธ์ œ ํ˜ธ์ถœํ• ์ง€ ์ •ํ•˜๊ณ  3๊ฐœ์˜ ๋ช…๋ น์–ด์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅธ๋‹ค.
ON table_name FOR EACH ROW
trigger_body;

์‹ค์Šต ์˜ˆ์ œ

-- Trigger
DESCRIBE test.youji_name_gender; -- describe๋Š” ๊ทธ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.(๊ตฌ์„ฑํ•˜๋Š” ํ•„๋“œ์˜ ์†์„ฑ,๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค).
CREATE TABLE test.youji_name_gender_audit (
    name varchar(16),
    gender enum('Male', 'Female'),
    modified timestamp
);
SELECT * FROM test.youji_name_gender;

CREATE TRIGGER test.before_update_youji_name_gender 
    BEFORE UPDATE ON test.youji_name_gender
    FOR EACH ROW 
 INSERT INTO test.youji_name_gender_audit
 SET name = OLD.name,
     gender = OLD.gender,
     modified = NOW();

UPDATE test.youji_name_gender -- ์ด ์—…๋ฐ์ดํŠธ ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ์‹œ์ ธ๋กœ ๋“ฑ๋ก๋œ ํ…Œ์ด๋ธ”์— ์ž๋™์œผ๋กœ old๊ฐ’์ด ์ถ”๊ฐ€๋œ๋‹ค.
SET name = 'youji123'
WHERE name = 'youji';

-- ์—…๋ฐ์ดํŠธ๋œ ๊ฒฐ๊ณผ ํ˜ธ์ถœ
select * from test.youji_name_gender;

-- ํŠธ๋ฆฌ๊ฑฐ๋กœ ์„ค์ •ํ•œ ํ•„๋“œ๊ฐ’๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.(update ํ›„)
SELECT * FROM test.youji_name_gender_audit;

4. Explain SQL๊ณผ Index ํŠœ๋‹

1๏ธโƒฃExplain SQL

  • SELECT/UPDATE/INSERT/DELETE ๋“ฑ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ๋‚ด๋ถ€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” SQL ๋ช…๋ น
    • MySQL์ด ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ• ์ง€ Execution Plan์„ ๋ณด์—ฌ์คŒ. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋А๋ฆฌ๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.
    • ๋ณดํ†ต ๋А๋ฆฐ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

์‹ค์Šต ์˜ˆ์ œ

-- EXPLAIN
EXPLAIN SELECT  -- ๋‚˜์ค‘์— ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค? ๊ทธ๋Ÿฌ๋ฉด explain์„ ์จ๋ณด์ž. ์ผ๋‹จ์€ ์ด๋Ÿฐ๊ฒŒ ์žˆ๋‹ค๋Š”๊ฒƒ์— ์ง‘์ค‘
  LEFT(s.created, 7) AS mon,
  c.channel,
  COUNT(DISTINCT user_id) AS mau
 FROM prod.session s
 JOIN prod.channel c ON c.id = s.channel_id
GROUP BY 1, 2      
ORDER BY 1 DESC, 2;

2๏ธโƒฃINDEX

  • Index๋Š” ํ…Œ์ด๋ธ”์—์„œ ํŠน์ • ์ฐพ๊ธฐ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ
    MySQL์ด ๋ณ„๋„๋กœ ๋งŒ๋“œ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.
    • ์ปฌ๋Ÿผ๋ณ„๋กœ ๋งŒ๋“ค์–ด์ง
    • Primary Key๋‚˜ Foreign Key๋กœ ์ง€์ •๋œ ์ปฌ๋Ÿผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Index๋ฅผ ๊ฐ–๊ฒŒ ๋จ
    • ํŠน์ • ์ปฌ๋Ÿผ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ž์ฃผ ํ•œ๋‹ค๋ฉด Index ์ƒ์„ฑ์ด ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ
  • INDEX์™€ KEY๋Š” ๋™์˜์–ด
  • Index๋Š” SELECT/DELETE/JOIN ๋ช…๋ น์„ ๋น ๋ฅด๊ฒŒ ํ•˜์ง€๋งŒ ๋Œ€์‹ 
    INSERT/UPDATE ๋ช…๋ น์€ ๋А๋ฆฌ๊ฒŒ ํ•˜๋Š” ๋‹จ์ ์ด ์กด์žฌ
    • ํ…Œ์ด๋ธ”์— ๋„ˆ๋ฌด ๋งŽ์€ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ธ๋ฑ์Šค์˜ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ
      ์ธํ•ด ์‹œ์Šคํ…œ์ด ์ „์ฒด์ ์œผ๋กœ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ.

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

CREATE TABLE example (
 id INT NOT NULL AUTO_INCREMENT,
 index_col VARCHAR(20),
 PRIMARY KEY (id),
 INDEX index_name (index_col)
 -- index ๋’ค์— ์‚ฌ์šฉํ•  ์ด๋ฆ„ ( ํ•„๋“œ ๋ช…)์„ ๋„ฃ์–ด์ค€๋‹ค.
);

์‹ค์Šต ์˜ˆ์ œ

CREATE TABLE test.session_with_index_youji (
    id int NOT NULL auto_increment,
    user_id int not NULL,
    created timestamp not NULL default CURRENT_TIMESTAMP,
    channel_id int not NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(channel_id) references prod.channel(id),
    INDEX user_id(user_id)
);

-- ์œ„์˜ ํ…Œ์ด๋ธ”์— ๊ธฐ์กด prod.session์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น ์‹คํ–‰
INSERT INTO test.session_with_index_youji SELECT * FROM prod.session;

-- ํ˜ธ์ถœ : index๊ฐ€ ๊ฑธ๋ฆฐ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
show index from test.session_with_index_youji;

-- ์„ฑ๋Šฅ๋น„๊ต
SELECT user_id, COUNT(1) FROM prod.session GROUP BY 1; -- 0.057 sec

SELECT user_id, COUNT(1) FROM test.session_with_index_youji GROUP BY 1; -- 0.027 sec 

-- => index๋ฅผ ์“ธ๋•Œ ์กฐ๊ธˆ ๋” ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.
profile
๊พธ์ค€ํ•œ ๊ธฐ๋ก์„ ํ•˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€