网站优化之 mysql 优化二

从三方面着手

web 服务器

后台程序

数据库

索引的使用原则

如果mysql认为,全表扫描不会慢于使用索引,则mysql会放弃索引,直接使用全表查询。

1.执行计划explain

捕捉性能常用的就是 打开‘慢查询’,定位执行效率差的sql,定位到sql执行还不算完,还需要知道sql的执行计划,比如全表扫描还是索引扫描,这些都需要通过explain完成。

2.列独立

索引字段不能够进行运算操作。

如果索引字段在where条件中不独立,就不能够使用索引。

字符类型的字段,查询时一定要添加引号(单引号),否则索引失效。

3.索引覆盖

如果查询的列正好是索引的一部分,那么查询只需要在索引区上进行,不需要到数据区再找数据,这种查询速度非常快,称为“索引覆盖”。 type=index 或 Extar using index (如果在innodb引擎下面,非主键索引取ID字段(主键)则会使用到索引覆盖。

innodb

根据id查询条件来得到id字段信息

因为是innodb,在普通索引上储存了主键索引ID号,所以在用普通索引作为条件查询主键时会使用到索引覆盖。

myisam

使用主键索引来查询会用到索引覆盖

普通索引查询id字段将不会用到索引覆盖

4.like 查询

一般情况下,再使用like查询时,左边字符中没有%的情况下,才可以使用索引(向左原则)。

like的%向左原则有一个例外,索引覆盖

注意:索引覆盖会让向左原则失效(在实际工作中模糊查询尽量不要在左边写 %)

5.OR运算

如果出现OR运算,要求所有参与的运算的字段都在索引,才会使用到索引OR两边,最好都有独立索引,实验前提数据要够大。

6.复合索引的使用

最左原则:

对于创建多列(复合)索引,只要查询条件使用了最左边的列,索引一般就会被使用。

如果多字段查询条件查询,推荐使用组合索引,独立索引只能让一个索引生效。

查询优化sql语句

1.慢查询日志

慢查询日志是mysql提供记录所执行的时间超过某个时间界限(默认10秒)的sql语句。在mysql中默认没有开启慢查询。

show variables like 'slow%';(查看是否开启了慢查询

show variables like 'long_query_time';(查看默认触发记录的时间 单位:秒

set global slow_query_log = 1;  (开启

set long_query_time = 3;(修改触发事件

2。精确记录查询时间

使用mysql提供profile机制完成。profile记录执行每次sql语句完成的具体时间,精确时间到小数点的八位。

show variables like '%profiling%';(查看是否开启

set profiling = 1;(开启profile记录

set profiling_history_size=20;(修改开启记录的记录数

set profiling=0;(关闭

show profiles;(查看记录sql语句的执行时间

锁与事务

1.锁的操作

1.1几种形式

锁机制:当客户端操作表(记录)时候,为了保证操作的隔离型(多个客户端操作不能互相影响),通过加锁处理

操作处理:

读锁:读操作时增加的锁,叫做共享锁,S-lock。特征是所有人都可以读,只有释放了锁之后才可以写。

共享锁的缺点:数据完整性不能得到很好的保证。

写锁:写操作时增加的锁,也叫独占锁或拍他锁,X-lock。特征:只有锁表的客户才可以操作表(读写),其他客户读也不可以

锁定粒度(范围)

表级锁:开销小,加锁快,发生锁冲突的概率最高,并发度最低

myisam 和 innodb的表 都支持表锁

行级锁;开销大,加锁慢,发生锁冲突概率最低,并发度也很高。

innodb 的表支持行锁和表锁;

锁是依赖于索引

1.2语法

lock tables 表名  read[读锁也叫共享锁]|write[写锁或独立锁];(锁定

unlock tables(释放

mysql自动提交给关闭  set autocommit=0;(行级锁  innodb

执行语句:

select * from 表名 where id=100 lock in share mode 共享锁

select * from 表名 where id=100 for update 排它锁

2.事务操作

1.为什么要用事物

事物是一条或多条数据库操作的集合,在事物中的操作,要么都执行修改,要么都不执行。银行转帐,支付,等都需要

2.事物的性质

在mysql只有使用了innodb存储引擎的表才支持事物

严格上来说,事物必须同时满足四个特性,即通常说的ACID属性。

原子性(atomicity):一个事物(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间的某个环节。事物在执行中发生错误,会被回滚(Rollback)到事物开始前的状态,就像这个事物从来都没有执行过一样。

一致性(consistency):在事物开始前和事物结束以后,数据完整性没有被破坏。

隔离型(isolation):数据库允许多个并发事物同时对其数据库进行读写和修改的能力,隔离型可以防止多个事物并发执行时由于交叉执行而导致的数据不一致。

持久性(durability):事物处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。

start transaction(开始一个事务

sql语句

commit 事务确认  / rollback 事务回滚

查询缓存

1.什么是查询缓存

mysql服务器提供的,用于缓存select语句一种内部内存缓存系统。

如果开启了查询缓存,将所有的查询结果,都缓存起来,使用同样的select语句,再次查询时,返回缓存的结果即可。

2.查询缓存的设置情况

命令:show variables  like ‘query_cache%’;

# 配置说明

query_cache_limit:单个查询能够使用的缓冲区大小

query_cache_size:缓存空间大小,单位是字节

query_cache_type:是否有开启缓存

配置查询缓存

3.缓存失效

当数据表结构发生改变时,缓存会失效

数据库进行如下操作时:insert,update,delete 会使数据表数据发生变化,缓存失效

注:使用查询缓存时,一定要注意 SQL语句的大小写,大小不一致,生效的缓存就会是多条。

4.不实用缓存

sql查询的语句是不固定的,有变化的,则不会使用到缓存,如随机数【order by rand()】

5.查看缓存空间的使用情况

执行:show status like ‘Qcache%’;

存储过程

1.概念

存储过程(procedure)

概念类似于函数,就是把一段CURD的sql语句封装起来,当要执行这一段代码的时候,可以调用该储存过程来实现。

存储过程是存储数据库中,经过第一次编译后再次调用不需要再次编译。而SQL语句每执行一次就编译一次,所以使用

存储过程可提高数据库执行速度。

2.创建储存过程

delimiter $$(改变结束分界符

create procedure 存储过程名([类型in] 参数1 数据类型, [类型in] 参数2 数据类型,…)(创建

参数的类型:

in(输入参数): 表示该形参只能接受实参的数据——这是默认值,不写就是in;

out(输出参数):表示该形参其实是用于将内部的数据“传出”到外部给实参;调用是用@变量调用

inout(输入输出参数):具有上述2个功能。

call 存储过程名(参数);(调用

drop procedure 存储过程的名称(删除存储过程

注:存储过程是属于数据库,在哪个数据库里面定义的,就在哪个数据库里面调用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容