MySQL存储引擎与索引
数据库性能优化重点
数据库性能优化重点
1、InnoDB存储引擎
2、MyISAM存储引擎
建表时在ENGINE处设置
CREATE TABLE user (
id INT,
) ENGINE = InnoDB;
InnoDB | MyISAM | |
---|---|---|
支持事务 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
外键 | 支持 | 不支持 |
锁级别 | 行级锁 | 表级锁 |
索引结构 | 聚集索引 | 非聚集索引 |
数据恢复 | 容易 | 困难 |
适用场景 | 读写均衡 | 读取频繁 |
BEGIN;
SELECT * FROM student;
INSERT INTO student value(1);
COMMIT;
CREATE TABLE student (
id INT,
introduce TEXT,
FULLTEXT INDEX fulltextIDX(introduce)
) ENGINE=MyISAM;
CREATE TABLE student (
id INT,
) ENGINE=InnoDB;
CREATE TABLE school (
id INT,
uid INT
) ENGINE=InnoDB;
ALTER TABLE `school` FOREIGN KEY (`uid`) REFERENCES `student`(`id`);
默认为主键,建表后自动生成
人为添加,同样指向数据
默认为主键,建表后自动生成
人为添加,指向主索引
所有辅助索引都使用了主索引,过长的主索引会令辅助索引文件变得过大
非递增字段会导致 B+ Tree 在插入新纪录时频繁的分裂调整,降低效率
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT
) ENGINE=MyISAM;
主索引能够极大提高效率
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT
) ENGINE=MyISAM;
SELECT * FROM student WHERE id > 5;
主索引 > 辅助索引 > 无索引
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR,
age INT,
INDEX(name)
) ENGINE=MyISAM;
SELECT * FROM student WHERE name = `zhangsan`;
表中存在 null 会导致全表扫描
SELECT id FROM student WHERE name is null;
//可以考虑用0代替null
查询语句存在 != 或 <> 操作符,会导致全表扫描
SELECT id FROM student WHERE name != `zhangsan`;
左模糊查询会导致全表扫描
SELECT id FROM student WHERE name like `%abc`; //会
SELECT id FROM student WHERE name like `abc%`; //不会
数据量大时,会出现问题,用哪列则查哪列
SELECT * FROM student;
MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
SELECT id FROM student WHERE name LIKE `abc%` LIMIT 1;
// ip地址的存储
mysql> SELECT inet_aton('255.255.255.255');
+------------------------------+
| inet_aton('255.255.255.255') |
+------------------------------+
| 4294967295 |
+------------------------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM student WHERE id = 2;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)