1.性能下降SQL慢的原因
- 执行时间长(cpu)
- 等待时间长(io)
具体原因:
- 查询语句烂
- 索引失效
- 关联查询join太多
- 服务器调优及各个参数的设置(缓冲 线程数等 )
2.常见通用的join查询
sql的执行顺序:
手写sql
机器执行
七种join
3.索引
3.1索引的简介
简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构”
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁盘上
我们一般所说的索引,如果没有特殊说明的话,就是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引。 一般java开发知道这些基本够用了
3.2索引的优势
类似大学图书馆建数目索引,提高数据检索效率,降低数据库的io成本
通过索引对数据进行排序,降低数据排序成本,降低了cpu的
3.3劣势
索引实际上也是一张表,保存了主键和索引字段,并指向实体表的记录,所以索引列也要空间
虽然索引大大提高了查询速度,但是会降低更新表的速度,如对表进行insert,update和delete。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件每次添加了索引列的字段
索引只是提高效率的一个因素,如果你的mysql有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
4.索引的使用
单值索引
唯一索引
复合索引
4.1基本语法
show index from TableName;(查看表的索引)
eg:show index from city;
create [unique] index indexname(索引名称) on TableName(字段名);
eg:create index idx_city_name on city(cname);
eg:create index idx_city_idnamepid on city(id,name,pid);
drop index indexname on TableName;
eg:drop index idx_city_name on city;
使用ALERT命令
ALERT TABLE tbl_name ADD PRIMARY KEY(column_list);该语句添加一个主键,这意味着索引值必须是唯一的,且不能为null;
ALERT TABLE tbl_name ADD UNIQUE index_name(column_list);这条语句创建索引的值必须是唯一的(除了null外,null可能会出现多次)
ALERT TABLE tbl_name ADD INDEX index_name(colmun_list);添加普通索引,索引值可出现多次
ALERT TABLE tbl_name ADD FULLTEXT index_name(column_list);该语句指定了索引为FULLTEXt,用于全文索引
4.2mysql索引结构
BTree索引
Hash索引
full-text索引
R-Tree索引
4.3检索原理
4.4哪些情况下需要创建索引
a.主键自动建立唯一索引
b.频繁作为查询条件的字段应该创建索引
c.查询中与其它表关联的字段,外键关系建立索引
d.频繁更新的字段不适合建立索引(因为每次更新不仅仅是更新数据还要更新索引,加重io负担)
e.where条件里用不到的字段不创建索引
f.单键/组合索引的选择问题(在高并发下倾向创建组合索引)
g.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
h.查询中统计或分组的字段
4.5哪些情况下不需要创建索引
a.表记录太少
b.经常增删改查的表(读少写多)
c.数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引,注意,如果某个数据列包含许多重复内容,为它建立索引就没有太大的实际效果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。