以前对索引的概念很模糊,今天看了上面这篇博文大致给了解一下。
随便总结一下
索引的优点:优化查询速度
索引的缺点:因为每次写入数据时索引都需要重新整理导致数据库开销大,创建的索引等于是将索引字段复制了一部分所以存储消耗也相应的增大。
索引的分类:聚集索引 非聚集索引
非/聚集索引区别:通过非聚集索引可以查询到对应的主键值,然后使用主键值通过聚集索引查找对应的数据对像。
主键:
- 保护实体的完整性
- 加快数据库的操作速度
- 添加记录时,dbms自动检查记录的主键,确保不会重复
- 默认按主键值顺序显示数据
主键在数据库中其实就是一个聚集索引,标识了某一行一列或多列的数据,代表了表结构的完整性。加了主键的表就相当于将整个表变成了一个索引,
查询语句(主键为id字段)
select age from table where id = 10;
此语句会根据聚集索引查找到目标对象然后返回对象的age字段select age from table where name='云';
此语句会遍历数据表匹配name字段为云的对象然后给出age字段
创建索引字段
create index index_name on tablename(name);
创建双字段覆盖索引
create index index_name_and_age on (name,age);
覆盖索引可以直接通过非聚集索引查找到另一字段信息,省去了通过主键查找的步骤。
关于sql查询语句优化方法
- 避免where子句中使用 != 或 <>等操作符(否则引擎放弃使用索引而进行全局扫描)
- 考虑在where及order by 涉及列上建立索引,避免全表扫描
- 避免where子句对字段进行null值判断,可以在考虑设默认值
- 避免在where子句中使用or来连接条件
eg:select id from tb where num=10 or num=20;
select id from tb where num=10 union all select id from tb where num=20;
- 能用between不要用 in not in
- 尽量避免where子句中使用函数,避免where子句=左侧进行运算
- exists替换in