전체 치트시트

MySQL 명령어 치트시트

MySQL / MariaDB 빠른 참조: 클라이언트 명령, DDL/DML 문, joins/aggregates, 인덱스, 트랜잭션, 백업/복원 — 자주 쓰는 옵션과 실전 예시까지 정리했습니다.

명령어 38개

연결

mysql -h <host> -P <port> -u <user> -p <db>

인터랙티브 MySQL 클라이언트 세션을 엽니다.

-h host; -P 3306 기본; -u user; -p password; -D db; -e cmd; -f 강제 계속; --safe-updates

mysql -h mysql.internal -u app -p app_production
mysql -u root -p -e "SHOW DATABASES;"

REPL 에 들어가지 않고 셸에서 SQL 문을 한 개 이상 실행합니다.

--tee file 출력 캡처; --html html 형식; --table 탭 구분

mysql -u root -p -e "SHOW SLAVE STATUS\G"

메타 & 정보

SHOW DATABASES

사용자가 볼 수 있는 모든 데이터베이스 목록.

SHOW SCHEMAS 는 동의어

SHOW DATABASES LIKE 'app%';
SHOW TABLES / DESCRIBE

현재 DB 의 테이블 목록; 단일 테이블의 컬럼은 DESCRIBE 로.

SHOW FULL TABLES; DESCRIBE t; SHOW COLUMNS FROM t

SHOW FULL TABLES WHERE Table_type != 'BASE TABLE';
SHOW CREATE TABLE <t>

테이블을 재생성하는 정확한 문을 출력 — 마이그레이션에 유용.

SHOW CREATE TABLE orders\G
EXPLAIN <statement>

쿼리 플랜과 인덱스 사용 표시. 도구용으로 FORMAT=JSON 을 앞에 붙이세요.

EXPLAIN FORMAT=JSON; EXPLAIN ANALYZE (MySQL 8.0+) 쿼리를 실행; EXTENDED/traditional 는 deprecated

EXPLAIN SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10;
SHOW STATUS / SHOW VARIABLES

서버 헬스 카운터와 튜닝 변수를 조회합니다.

SHOW GLOBAL STATUS LIKE 'Threads_running'; SHOW VARIABLES LIKE 'innodb_buffer_pool_size%';

SHOW GLOBAL STATUS LIKE 'Slow_queries';

데이터베이스 & 스키마

CREATE DATABASE <db>

문자셋과 콜레이션을 옵션으로 지정해 새 DB 생성.

CHARACTER SET utf8mb4; COLLATE utf8mb4_0900_ai_ci; ENCRYPTION 'Y' (8.0.16+)

CREATE DATABASE app_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE <db> / DROP DATABASE <db>

기본 데이터베이스를 전환하거나 기존 DB 를 삭제합니다.

USE 는 마지막 결과를 비우고 DB 를 설정; DROP DATABASE 는 복구 불가

DROP DATABASE IF EXISTS app_old;

테이블 & DDL

CREATE TABLE

새 테이블 정의 — 컬럼, 키, 기본값, 엔진 옵션.

ENGINE=InnoDB; DEFAULT CHARSET=utf8mb4; AUTO_INCREMENT=<n>; KEY/UNIQUE/PRIMARY KEY 제약

CREATE TABLE orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, total DECIMAL(10,2) NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_user_created (user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE

컬럼과 인덱스 추가/이름변경/삭제, 엔진 변경, 옵션 설정.

ADD COLUMN; DROP COLUMN; MODIFY/ALTER COLUMN; ADD/DROP INDEX; RENAME; ORDER BY; ALGORITHM=INSTANT|INPLACE|COPY

ALTER TABLE orders ADD COLUMN status ENUM('pending','paid','cancelled') NOT NULL DEFAULT 'pending', ADD INDEX idx_status (status);
DROP TABLE / TRUNCATE TABLE

테이블 삭제(CASCADE 옵션) 또는 빠르게 비우기(AUTO_INCREMENT 리셋).

DROP TABLE IF EXISTS; TRUNCATE TABLE; FOREIGN_KEY_CHECKS=0 로 테이블 간 작업 허용

TRUNCATE TABLE staging.events;
RENAME TABLE <a> TO <b>

원자적 이름 변경 — 섀도 테이블과의 핫스왑에 유용.

RENAME TABLE orders TO orders_old, orders_new TO orders;

DML

INSERT INTO <t> [(cols)] VALUES ...

한 개/여러 행 삽입; 다중 행 INSERT 가 여러 단일 INSERT 보다 빠릅니다.

INSERT IGNORE; ON DUPLICATE KEY UPDATE (upsert); INSERT ... SELECT; LAST_INSERT_ID()

INSERT INTO orders(user_id, total) VALUES (1, 9.99), (1, 4.50), (2, 19.95);
INSERT ... ON DUPLICATE KEY UPDATE

Upsert — unique/primary 키 충돌 시 업데이트; affected-rows 는 2 를 반환.

구/신을 위한 VALUES(col); 자동증가 체인용 LAST_INSERT_ID() 트릭

INSERT INTO counters(id, hits) VALUES (1, 1) ON DUPLICATE KEY UPDATE hits = hits + 1
REPLACE INTO ...

유니크 키 충돌 시 delete+insert 의 단축형(deprecated 패턴).

REPLACE INTO settings(k, v) VALUES ('theme', 'dark')
UPDATE / DELETE

행을 수정하거나 제거. WHERE 가 없으면 테이블 전체가 영향을 받습니다.

UPDATE ... ORDER BY ... LIMIT n; 다중 테이블 UPDATE t1, t2 SET ... WHERE ...; ON DELETE CASCADE

UPDATE orders SET status='paid' WHERE user_id = 42 AND status='pending' ORDER BY created_at LIMIT 100;
DELETE ... ORDER BY ... LIMIT N

undo 로그와 잠금 시간을 제한해 큰 덩어리의 행을 천천히 삭제합니다.

LIMIT N; 루프 반복; 전체 행은 truncate 고려

DELETE FROM events WHERE created_at < now() - INTERVAL 30 DAY ORDER BY id LIMIT 5000

쿼리 & 필터

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... OFFSET ...

필터, 정렬, 페이지 매김으로 행을 읽습니다.

DISTINCT; IN (subquery) / ANY / ALL; BETWEEN; IS NULL; REGEXP; STRAIGHT_JOIN 힌트

SELECT id, status FROM orders WHERE user_id = 42 AND status IN ('paid','shipped') ORDER BY created_at DESC LIMIT 10 OFFSET 20;
GROUP BY ... HAVING ...

행을 집계한 뒤 그 결과에 필터를 적용합니다.

sql_mode=ONLY_FULL_GROUP_BY (8.0+); WITH ROLLUP 으로 총계 행 추가

SELECT user_id, count(*) AS n, sum(total) AS gmv FROM orders GROUP BY user_id HAVING count(*) >= 3 ORDER BY gmv DESC LIMIT 50;

조인

[INNER | LEFT | RIGHT | CROSS] JOIN ... ON ...

여러 테이블의 행을 결합합니다.

STRAIGHT_JOIN; USING(col); nested-loop/hash 는 MySQL 8.0+ 에서만; JSON_TABLE

SELECT u.email, count(o.id) FROM users u LEFT JOIN orders o ON o.user_id = u.id GROUP BY u.email ORDER BY count(o.id) DESC;
WITH cte AS (...) SELECT ...

Common Table Expressions — 8.0 부터 재귀 지원.

WITH RECURSIVE org AS (SELECT id, manager_id, name FROM staff WHERE manager_id IS NULL UNION ALL SELECT s.id, s.manager_id, s.name FROM staff s JOIN org o ON s.manager_id = o.id) SELECT * FROM org;

집계

COUNT() / SUM() / AVG() / MIN() / MAX() / GROUP_CONCAT()

내장 집계 함수.

COUNT(DISTINCT x); GROUP_CONCAT(col ORDER BY col SEPARATOR ',')

SELECT day(created_at) AS d, sum(total) AS gmv, count(*) AS n FROM orders GROUP BY day(created_at) ORDER BY d DESC LIMIT 7;

인덱스 & 뷰

CREATE INDEX ...

룩업과 ORDER BY 를 가속하는 보조 인덱스 추가.

UNIQUE; FULLTEXT/SPATIAL (스토리지 엔진 인지); ON tbl(col, ...) 로 복합; INVISIBLE 플래그 (8.0+); 키 파트에 DESC

CREATE INDEX idx_user_created ON orders(user_id, created_at DESC) ALGORITHM=INPLACE LOCK=NONE;
DROP INDEX / ALTER TABLE ... DROP INDEX

인덱스를 제거. ALTER TABLE 로 추가와 삭제를 한 번에 할 수 있습니다.

ALTER TABLE orders DROP INDEX idx_user_created;
CREATE VIEW / CREATE OR REPLACE VIEW

저장된 SELECT; 업데이트 가능한 뷰는 제한 하에 INSERT/UPDATE/DELETE 지원.

CREATE OR REPLACE; WITH CHECK OPTION 은 쓰기 시 WHERE 필터 강제; ALGORITHM=MERGE|TEMPTABLE

CREATE OR REPLACE ALGORITHM=MERGE SQL SECURITY INVOKER VIEW v_user_orders AS SELECT user_id, count(*) AS n FROM orders GROUP BY user_id;

트랜잭션

START TRANSACTION / COMMIT / ROLLBACK

문을 ACID 단위로 감쌈; 기본은 autocommit (단일 문은 Tx 불필요).

START TRANSACTION WITH CONSISTENT SNAPSHOT; COMMIT; ROLLBACK TO SAVEPOINT

START TRANSACTION; UPDATE ...; ROLLBACK;
SET autocommit = 0; SET TRANSACTION ISOLATION LEVEL ...

문 단위 autocommit 비활성; 격리 수준 변경: REPEATABLE READ (InnoDB 기본), READ COMMITTED, READ UNCOMMITTED, SERIALIZABLE.

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET autocommit = 0;
SELECT ... FOR UPDATE / LOCK IN SHARE MODE

동시성 하 안전을 위한 행 단위 잠금. NOWAIT/SKIP LOCKED 는 8.0+ 에서 사용 가능.

FOR UPDATE NOWAIT / SKIP LOCKED

SELECT id FROM jobs WHERE status='queued' ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED;

백업 & 복원

mysqldump -u <user> -p <db> > dump.sql

논리 백업: SQL INSERT / DDL 을 파일로 출력합니다.

--single-transaction (InnoDB 용); --routines; --triggers; --no-data 스키마만; --add-drop-table; --column-statistics=0

mysqldump -u root -p --single-transaction --routines --triggers --events app > /backup/app-$(date +%F).sql
mysql -u root -p <db> < dump.sql

SQL 덤프를 (대상) DB 에 재실행합니다.

--force; --auto-rehash; --comments

mysql -u root -p app_new < /backup/app.sql
SOURCE /path/script.sql

REPL 안에서 SQL 스크립트를 실행합니다.

source 는 마지막 문에 종료자가 필요 없음; CLI 의 \.

SOURCE /tmp/migrations/0002_add_index.sql;
mysqlbinlog binlog.000001 > incr.sql

바이너리 로그를 SQL 로 변환하여 point-in-time 복구에 사용합니다.

--start-datetime; --stop-datetime; --start-position; --stop-position

mysqlbinlog --start-datetime='2026-07-23 00:00:00' /var/lib/mysql/binlog.000123 > /inc.sql

사용자 & 권한

CREATE USER / ALTER USER / DROP USER

MySQL 계정을 관리합니다.

IDENTIFIED BY '...'; IDENTIFIED WITH caching_sha2_password; WITH MAX_CONNECTIONS 10;

CREATE USER 'reporting'@'%' IDENTIFIED BY 'P@ssw0rd!'; ALTER USER 'app'@'%' PASSWORD EXPIRE NEVER;
GRANT / REVOKE

객체/전역 권한; 조합으로 실제 가능한 능력이 결정됩니다.

GRANT SELECT ON app.* TO 'reporting'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'%';
FLUSH PRIVILEGES

수동 변경 후 인메모리 권한 테이블을 다시 로드(GRANT 문 후에는 불필요).

FLUSH HOSTS / LOGS / TABLES

FLUSH PRIVILEGES;

진단

SHOW PROCESSLIST / KILL <id>

실행 중인 스레드 표시; KILL 로 오래 실행 중이거나 멈춘 쿼리를 종료.

SHOW FULL PROCESSLIST 는 전체 SQL; KILL CONNECTION 은 클라이언트 중단; KILL QUERY 는 쿼리만 중단

SHOW FULL PROCESSLIST\G; KILL 12345;
SHOW ENGINE INNODB STATUS\G

상세 InnoDB 진단: 잠금, 트랜잭션, 버퍼 풀, 히스토리.

PERFORMANCE_SCHEMA queries: SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;

SHOW ENGINE INNODB STATUS\G

치트시트 버전 1.0.0

MySQL 8.0+ 대응