MySQL ?

SQL, and

Solutions

EXPLAINRecommended

-- 1. EXPLAIN
EXPLAIN SELECT o.order_no, u.username, o.total_amount
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 1 AND o.created_at > '2026-05-01'
ORDER BY o.created_at DESC
LIMIT 20; -- 2. : -- type: ALL(,) → index → range → ref → const()
-- key: NULL -- rows:, -- Extra: Using filesort / Using temporary -- 3. CREATE INDEX idx_status_created ON orders(status, created_at);

EXPLAIN MySQL,, and more. SQL.

:

Recommended

-- : -- 1. WHERE ()
CREATE INDEX idx_user_status_time ON orders(user_id, status, created_at); -- 2. ()
CREATE INDEX idx_cover ON orders(user_id, status, created_at, total_amount);
--, -- 3. -- : WHERE YEAR(created_at) = 2026 ()
-- : WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01' -- : WHERE phone LIKE '%1234' ()
-- : WHERE phone LIKE '138%' () -- : WHERE status != 1 ( and more)
-- : WHERE status IN (0, 2, 3) ( IN )

., SQL.

: EXPLAIN type=ALL key=NULL

SQL

-- 1. SELECT *
-- : SELECT * FROM orders WHERE user_id = 1001;
-- : SELECT order_no, total_amount, status FROM orders WHERE user_id = 1001; -- 2. -- : SELECT * FROM orders ORDER BY id LIMIT 100000, 20; ( 10 )
-- : SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 20; () -- 3., JOIN
-- : SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE status = 1);
-- : SELECT DISTINCT u.* FROM users u JOIN orders o ON u.id = o.user_id WHERE o.status = 1; -- 4. -- : INSERT
-- : INSERT INTO t VALUES (..), (..), (..); ()

SQL. SELECT *, JOIN.

:

-- SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 1 SET GLOBAL log_queries_not_using_indexes = ON; -- SHOW VARIABLES LIKE 'slow_query_log_file'; -- mysqldumpslow Top 10 -- mysqldumpslow -s t -t 10 /var/log/mysql/slow.log -- pt-query-digest -- pt-query-digest /var/log/mysql/slow.log > report.txt

SQL,.

: and

,
pt-online-schema-change
EXPLAIN,

Related Commands