mysql索引优化
1,执行时间长,等待时间长
原因:sql语句写的不好,没有索引或者索引失效,查询关联太多join,服务器调优和参数设置
2,7中join理论
内连接 select * from tablea inner join tableb on tablea.id=tableb.id;
左连接
select * from tablea left [outer] join tableb on tablea.id=tableb.id;
select * from tablea left [outer] join tableb on tablea.id=tableb.id where tableb.id=null;
右连接
select * from tablea right[outer] join tableb on tablea.id=tableb.id;
select * from tablea right[outer] join tableb on tablea.id=tableb.id where tablea.id=null;
全连接(mysql不支持,mysql支持并集union,不支持差集,交集)
select * from tablea full[outer] join tableb on tablea.id=tableb.id;
select * from tablea full[outer] join tableb on tablea.id=tableb.id where tablea.id=null or tableb.id=null;
3,索引
官方定义:索引是一种高效获取数的数据结构。
索引目的:提高查找效率,通过索引列 对数据排序,降低数据排序成本。可以简单的理解为 排好序 的 快速查找 的数据结构。
数据库还维护着满足某种特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这种数据结构上实现高级查找算法,这种数据结构,就是索引,B树索引。
索引文件一般也很大,一般以文件形式存在磁盘上。
一般开发所说索引是B树(多路搜索树)结构组织树,其中聚集索引,次要索引,覆盖索引,复合索引,前文索引,唯一索引等默认是B+树索引,统称索引。除了B+树索引外,还有哈希索引等。
索引劣势:实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,索引也是占用磁盘空间的。
索引可以提高查询速度,却会降低更新(insert,update,delete)数据的速度,因为更新表的时候,不仅要保存数据,还要更新索引文件中新更新数据的索引。
索引只是一个提高查询效率的因素,需要花时间研究建立优秀的索引文件,优化查询。
3.1 索引分类
单值索引,一个索引包含一列。
唯一索引 ,索引列的值唯一,允许为空。
复合索引,一个索引包含多列。
语法:
创建:
create index 索引名 on table[列]
alter table add 索引 索引名 on 列
删除
drop index[索引名] on table
查看
show index from table
3.2 索引结构
btree索引
hash索引
full-text全文索引
R-tree索引
3.3 索引的适用情况
1,主键自动建立唯一索引
2,频繁查询的字段可以建立索引
3,外键可以建立索引
4,频繁更新的字段不适合建立索引
5,where 条件查询中用不到的字段不适合建立索引
6,高并发下倾向于建立组合索引
7,查询中排序的字段,排序字段通过索引访问将会极大提高访问速度
8,查询中分组或统计的字段