1. 索引
- BTree
B-Tree是最常见的索引类型, 所有值(被索引的列)都是排过序的, 每个叶节点到跟节点距离相等.
所以B-Tree适合用来查找某一范围内的数据, 而且可以直接支持数据排序(ORDER BY)
B-Tree在MyISAM里的形式和Innodb稍有不同:
MyISAM表数据文件和索引文件是分离的, 索引文件仅保存数据记录的磁盘地址
InnoDB表数据文件本身就是主索引, 叶节点data域保存了完整的数据记录
- Hash
1.仅支持"=",“IN"和”<=>"精确查询, 不能使用范围查询:
由于Hash索引比较的是进行Hash运算之后的Hash值, 所以它只能用于等值的过滤, 不能用于基于范围的过滤, 因为经过相应的Hash算法处理之后的Hash
2.不支持排序:
由于Hash索引中存放的是经过Hash计算之后的Hash值, 而且Hash值的大小关系并不一定和Hash运算前的键值完全一样, 所以数据库无法利用索引的数据来避免任何排序运算
3.在任何时候都不能避免表扫描:
由于Hash索引比较的是进行Hash运算之后的Hash值, 所以即使取满足某个Hash键值的数据的记录条数, 也无法从Hash索引中直接完成查询, 还是要通过访问表中的实际数据进行相应的比较, 并得到相应的结果
4.检索效率高, 索引的检索可以一次定位, 不像B-Tree索引需要从根节点到枝节点, 最后才能访问到页节点这样多次的IO访问, 所以Hash索引的查询效率要远高于B-Tree索引
5.只有Memory引擎支持显式的Hash索引, 但是它的Hash是nonunique的, 冲突太多时也会影响查找性能.
Memory引擎默认的索引类型即是Hash索引, 虽然它也支持B-Tree索引
- FullText
即为全文索引, 目前只有MyISAM引擎支持.
其可以在CREATE TABLE , ALTER TABLE , CREATE INDEX 使用, 不过目前只有 CHAR, VARCHAR , TEXT 列上可以创建全文索引.
值得一提的是, 在数据量较大时候, 现将数据放入一个没有全局索引的表中, 然后再用CREATE INDEX创建FULLTEXT索引, 要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多.
全文索引并不是和MyISAM一起诞生的, 它的出现是为了解决WHERE name LIKE *%word%"这类针对文本的模糊查询效率较低的问题.
在没有全文索引之前, 这样一个查询语句是要进行遍历数据表操作的, 可见, 在数据量较大时是极其的耗时的, 如果没有异步IO处理, 进程将被挟持, 很浪费时间
- RTree
R-Tree在MySQL很少使用, 仅支持geometry数据类型, 支持该类型的存储引擎只有MyISAM, BDb, InnoDb, NDb, Archive几种.
2. Todo
2.0.1. 逻辑架构
2.0.2. 问题
2.0.2.0.1. 锁
2.0.2.0.2. 优化
2.0.2.0.3. 分表分库对查询的影响
2.0.2.0.4. inner, left, right join的区别
SQL查询慢 如何处理?
- 表结构有问题
表字段太多, 有很多不太常用的字段, 可以按字段冷热分表
没有建立索引 - SQL需要优化
SQL没有用到索引, 使用describe检查
SQL太复杂, 裁剪成多个小查询 - 排它锁更新数据, 导致查询变慢
- 数据量太大
分表分库
读写分离 - 服务器问题
并发连接数过低
云数据库访问慢
内存, CPU等不足
3. 常见问题
3.1. error 2059: Authentication plugin ‘caching_sha2_password’ cannot be loaded
mysql-8 的验证方式变了, 改为了 caching_sha2_password
如果不修改配置 会出现这个错误