1.索引
数据量很大 百万 千万,查询很频繁,修改不频繁。
核心目的,为了检索效率高。
单位:列,主键列,唯一列(unique),外键列 自动有索引。
适合做索引的数据列: 查询条件列(where) 分组条件列 排序条件列
索引的存储位置:在mysql的“
data
”目录中有诸多**数据库目录
,其中存放的是数据库中所有表的文件,也包含索引文件
**索引的存储结构,要先了解 BTree
2. B-Tree
3. B+Tree
非叶子节点,不存数据,只存关键字
4. MyISAm引擎
采用B+tree,非聚集索引
非聚集索引的B+tree上,叶子节点存储的是
“关键字”和“对应数据行的磁盘位置”
,只存储索引,不支持事务管理和外键非聚集索引在找到准确的叶子后,读取到的是 数据在磁盘的准确位置。
5. InnoDB引擎
采用B+tree,聚集索引
聚集索引的B+tree上,所有叶子节点存储是
”关键字“和对应的“数据行”
,存储的是索引和数据,支持事务管理和外键聚集索引在找到准确的叶子后,读取到的是 对应行的完整数据。
6. 索引数据量级
6.1 节点大小
16kb
windows的4个page = mysql的一个page
mysql> show variables like '%page%';#查看mysql的pageSize
6.2 数据量
B+tree 一般都是 3层,千万级别的数据量
7. 主键选型
建表必须建主键,因为表格的数据都在主键索引树上。
如果没有主键,则mysql自动选择唯一列充当主键的作用。
如果也没有唯一列,则mysql自动创建一个伪列,充当主键。
主键类型,以具有
“单调性”
的类型为最佳。
int/bigit auto_increment primary key
8. Explain
查看执行计划
mysql> explain select xxx,xxx,xx from t_user where ....; #查看执行计划,查看索引的使用情况,type=all代表全表扫描
9. 不适合建索引的列
**
选择性
**差的列,不建议建索引。
select count(distinct name)/count(1) from t_user;