mysql查询与索引优化优化1

1.性能降低SQL慢的缘由

  • 执行时间长(cpu)
  • 等待时间长(io)

具体缘由:java

  • 查询语句烂
  • 索引失效
  • 关联查询join太多
  • 服务器调优及各个参数的设置(缓冲 线程数等 )

2.常见通用的join查询

sql的执行顺序:
手写sql
clipboard.png
机器执行
clipboard.pngmysql

clipboard.png

七种join
图片描述sql

3.索引

3.1索引的简介

简单来讲,索引是一种数据结构 其目的在于提升查询效率 能够简单理解为“排好序的快速查找结构”数据库

clipboard.png

通常来讲,索引自己也很大,不可能所有存储在内存中,所以索引每每以索引文件的形式存储在中磁盘上
咱们通常所说的索引,若是没有特殊说明的话,就是指B+树结构组织的索引。其中汇集索引,次要索引,覆盖索引,复合索引,前缀索引,惟一索引默认都是使用B+树索引。 通常java开发知道这些基本够用了服务器

3.2索引的优点

相似大学图书馆建数目索引,提升数据检索效率,下降数据库的io成本
经过索引对数据进行排序,下降数据排序成本,下降了cpu的数据结构

3.3劣势

索引实际上也是一张表,保存了主键和索引字段,并指向实体表的记录,因此索引列也要空间并发

虽然索引大大提升了查询速度,可是会下降更新表的速度,如对表进行insert,update和delete。由于更新表时,mysql不只要保存数据,还要保存一下索引文件每次添加了索引列的字段高并发

索引只是提升效率的一个因素,若是你的mysql有大数据量的表,就须要花时间研究创建最优秀的索引,或优化查询语句。性能

4.索引的使用

单值索引
惟一索引
复合索引mysql索引

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检索原理

clipboard.png

clipboard.png

clipboard.png

clipboard.png

4.4哪些状况下须要建立索引

a.主键自动创建惟一索引
b.频繁做为查询条件的字段应该建立索引
c.查询中与其它表关联的字段,外键关系创建索引
d.频繁更新的字段不适合创建索引(由于每次更新不单单是更新数据还要更新索引,加剧io负担)
e.where条件里用不到的字段不建立索引
f.单键/组合索引的选择问题(在高并发下倾向建立组合索引)
g.查询中排序的字段,排序字段若经过索引去访问将大大提升排序速度
h.查询中统计或分组的字段

4.5哪些状况下不须要建立索引

a.表记录太少b.常常增删改查的表(读少写多)c.数据重复且分布平均的表字段,所以应该只为最常常查询和最常常排序的数据列创建索引,注意,若是某个数据列包含许多重复内容,为它创建索引就没有太大的实际效果

相关文章
相关标签/搜索