Open 499689317 opened 4 years ago
- 负向条件查询会全表扫描
// 使用!=, not in, not exist等负向条件 select name from student where id != 1 and id != 2
- 前导模糊查询会全表扫描
// _表示匹配单个任意字符,%表示匹配任意个任意字符 select id from student where name like '%小明' 改为 select id from student where name like '王小%'
- B-Tree索引的时间复杂度是O(logn),Hash索引的时间复杂度是O(1)。
/* 计算机硬盘的最小存储单元为扇区,一个扇区占512字节。操作系统中文件系统最小存储单元为块,一个块占用4KB,Mysql中的文件存储系统最小单元为页,一页占用16KB。 如:一个文本文件写入一个字符,文件大小为1个字节,但在计算机磁盘中要占用4KB,相当于8个扇区。 假设一个Mysql表中一条记录占用1KB情况下,一页可存储16条记录,B+树中非叶子节点存储的是键与指针,叶子节点存储数据。如果主键为bigint类型(占用8字节),Mysql中指针占用6字节,则可知一个键与指针占用14字节。那么一页可存储16384/14=1170个键与指针。当树高度为2时,可存储1170*16=18720条记录,当树高为3时可存储1170*1170*16=21902400条记录,一般不会让树高度超过3层。即查询一次数据库只需要1-3次io操作。 */
如果表数据以单条记录查询为主,建议创建Hash索引
- 如果查询的结果只有一条记录,使用limit 1主动让数据库查询到结果后停止游标向后移动,可以优化此次查询
- 高并发下,应该将计算转移到业务层,释放数据库cpu,数据库仅只是擅长存储与索引。
- 字段定义为NOT NULL,并提供相应的默认值
/* NULL的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化 NULL这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多 NULL值需要更多的存储空,无论是表还是索引中每行中的null的列都需要额外的空间来标识 */
- 避免多表join查询,在join查询时要确保关联字段有索引。
- 创建复合索引时,区分度越高越靠前创建。
- 使用唯一索引可确保业务层不需要先查后插就能保证记录唯一性。
- 使用ISNULL()函数来判断字段是否为NULL。
- 使用外键会引发级联操作,应尽量避免使用外键。
mysql注意事项