❒ What I learned :
Define Table
Define Indexes for table columns
- indices for a table is preferable if there are a number of data rows
- index for a column is preferable if the column is NOT NULL
- 3-4 indices for a table are ok
- updating or deleting performance decreases for tables with many indices
- choose index column with High Cardinality
- high : uncommon and unique. e.g. autoincrement seq, timestamp
- high cardinality means one can opt out large amount of data by using index
- low : with few unique values, typically status flags, boolean values.
- Multi-column index: second column relies on first, third relies on second, and so on.
- Order: Cardinality decreasing (High to Low)
- WHERE clause must include first index column in order to use index
- e.g. Given 1,2,3, must use (1 and 3) or (1 and 2)
- the order in which columns are used in the where clause is trivial
- `BETWEEN`, `LIKE`, `>`, `<` will skip index use
- `=`, `IN`(same is using `=` multiple times)는 uses index
- `IN` with Subquery will decrease performance
- `OR` : FULL table scan
- using arithmetic operation on index column will skip index `WHERE SALARY * 10 = 100`
Define primary, foreign, unique keys for columns
Optimize query with index columns and row limit
Make use of EXPLAIN statement to get detailed info about how statements are executed
❒ Example
CREATE TABLE `VOTE_HISTORY` (
`SEQ` BIGINT(21) NOT NULL AUTO_INCREMENT COMMENT 'seq',
`LOGIN_ID` VARCHAR(50) NOT NULL COMMENT 'login id',
`STAR_TYPE` CHAR(1) NOT NULL COMMENT 'type 1.single 2.group',
`STAR_CD` INT(11) DEFAULT 0 NOT NULL COMMENT 'target candidate's star code',
`GRP_CD` VARCHAR(10) NOT NULL COMMENT 'target candidate's group code',
`VOTE_DT` DATETIME NOT NULL COMMENT 'date of the voting',
PRIMARY KEY (`SEQ`),
-- a user must have exactly 'one' vote history of a candidate
UNIQUE KEY `udx_vote_log_01` (`login_id`, `star_type`, `star_cd`, `grp_cd`)
) ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'vote history';
-- Cardinality : LOGIN_ID > STAR_TYPE
ALTER TABLE VOTE_HISTORY ADD INDEX `idx_vote_history_01` (`LOGIN_ID`, `STAR_TYPE`);
SELECT
SEQ
, LOGIN_ID
, STAR_CD
, GRP_CD
WHERE
1=1
AND LOGIN_ID = 'OOO'
AND STAR_TYPE = '1';