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,