MySQL优化是通过对查询语句和数据库结构进行优化,以提高数据库性能和查询效率的过程。MySQL优化的主要目标是减少查询时间、减少数据库资源的消耗,并提高系统的响应速度。
一种常见的MySQL优化方法是使用合适的索引。索引是一种数据结构,能够加速数据的查找和排序。通过在查询语句的关键列上创建索引,可以减少查询的扫描范围,从而提高查询速度。可以使用EXPLAIN语句来分析查询语句的执行计划,以确定是否使用了合适的索引。
另外,优化查询语句的编写方式也是MySQL优化的重要方面。可以避免不必要的JOIN操作、减少查询的数据量、避免使用SELECT * 等不必要的列,以及使用LIMIT来限制结果集的大小等。
MySQL还提供了一些性能调优参数,可以根据实际情况进行调整。例如,可以调整innodb_buffer_pool_size参数来优化InnoDB存储引擎的缓冲池大小,以提高读取性能。可以调整max_connections参数来控制并发连接数,以提高系统的响应能力。
在优化过程中,还可以利用MySQL的查询缓存功能,将经常执行的查询结果缓存起来,减少数据库的访问次数,提高查询的响应速度。
综上所述,MySQL优化涉及多个方面,包括合适的索引设计、优化查询语句、调整性能参数等。通过综合使用这些方法,可以提高MySQL数据库的性能和查询效率
sql性能下降原因:
1、查询语句写的烂
2、索引失效
3、关联查询太多join
4、服务器调优及各个参数设置(例如缓冲和线程数等)
通常sql调优过程
1、开启慢查询并捕获
2、explain+慢sql分析
3、show profile 查询sql在mysql服务器里面的执行细节和生命周期情况
4、SQL数据库服务器的参数调优
一种排序好了的数据结构 B+树
索引的优势:
1、提高数据查询效率,降低数据库的IO成本
2、索引对数据进行排序,降低数据排序成本,降低了CPU消耗
劣势:
1、索引实际上也是一张表,保存了主键和索引的字段,占用空间
2、降低表的更新速度,因为在更新表的时候,还需要保存索引文件
不建议使用索引:
1、表的记录太少
2、经常增删改的表
3、where条件里用不到的字段
1、表中的列设置成为主键后,数据库会自动建立主键索引
2、单独创建主键索引:
a、创建:alter table 表名 add primary key(字段)
b、删除:alter table 表名 drop primary key (字段)
1、表中的列创建了唯一约束时,数据库会自动建立唯一索引
2、单独创建唯一索引:
a、创建:alter table 表名 add unique 索引名(字段)
或者 create unique index 索引名 on表名(字段)
b、删除:drop index 索引名 on 表名
一个索引只包含单个列,一个表可以有多个单值索引
一个索引包含多个列
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈
id相同的时候,执行顺序是从上往下
id不同的时候,id的值越大优先级越高,优先级越高,越早执行
输出的这一行的数据是关于哪一张表的
查询的类型,常见值有:
1、**SIMPLE: ** 简单的select查询,查询中不包含子查询或者UNION
2、PRIMARY: 查询中若包含任何复杂的子部分,最外层查询则被标记为primary
3、DERIVED: 在from列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里
4、SUBQUERY: 在select或where列表中包含了子查询
5、UNION:如果第二个select出现在union之后,则被标记为union,如果union包含在from子句的子查询中,最外层select被标记为derived
6、 **union result :**union的结果
1、**system:**表中仅有一行(=系统表)这是const联结类型的一个特例。
2、**const:**表示通过索引一次就找到,const用于比较primary key或者unique索引。因为只匹配一行数据,所以如果将主键置于where列表中,mysql能将该查询转换为一个常量
3、**eq_ref:**唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于唯一索引或者主键扫描
4、**ref:**非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体
5、**range:**只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是where语句中出现了between,in等范围的查询。这种范围扫描索引扫描比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描
6、index:index 与all区别为index类型只遍历索引树。通常比all快,因为索引文件比数据文件小很多。
7、**all:**遍历全表以找到匹配的行
从最好到最差的排序依次是:system > const > eq_ref > ref > range > index > all
注意:一般保证查询至少达到range级别,最好能达到ref。
possible_key:显示可能应用在这张表中的索引,一个或多个。查询设计到的字段上如果存在素索引,则该索引将会被列出来,但不一定会被查询实际使用上
key:查询中实际使用的索引
key_len:符合索引中key_len越长越好
ref:显示索引的哪一列被使用了,哪些列或常量被用于查找索引列上的值
rows列显示MySQL认为它执行查询时必须检查的行数,一般越少越好
一些常见的重要的额外信息:
Using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”
Using temporary:MySQL在对查询结果排序时使用临时表,常见于排序order by 和分组查询group by
Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错
Using where :表示使用了where过滤
1、最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不挑锅索引中的列,如果不满足最佳左前缀法则的话,索引失效
2、不在索引列上做任何计算、函数操作、会导致索引失效而转向全表扫描
3、存储引擎不能使用索引中范围条件右边的列(就是指在进行范围判断右边的列不会使用索引)
4、MySQL在使用不等于时无法使用索引,会导致全表扫描
5、is null 可以使用索引,但是 is not null 无法使用索引
6、like以通配符开头会使索引失效
7、字符串不加单引号索引会失效
8、使用or连接时,索引也会失效
1、尽量避免使用Using FileSort 方式排序
2、order by 语句使用索引最左前列(并且排序方式需要保持一致)或使用where子句和order by子句条件组合满足索引最左前列 比如 where a order by b c ------------索引 a b c 也是生效的
3、where子句中如果出现索引范围查询会导致order by 索引失效
内连接的时候,mysql会自动把小结果集的选为驱动表,所以大表的字段最好加上索引,左外连接时,左表会全表扫描,所以右边的大表字段最好加上索引。右外连接同理。