Blogger Information
Blog 13
fans 0
comment 0
visits 11347
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
mysql性能优化
莫名的博客
Original
802 people have browsed it

mysql性能的优化:

1.mysql基础操作

2.常用的sql技巧

3.sql语句优化

4.mysql数据库优化

5.mysql服务器优化


1.mysql的基础操作

1.1 mysql表复制

命令:

复制表结构:create table table1 like table2

复制数据:insert into table1 select * from table2;

1.2 mysql索引

命令:

创建索引:

普通索引:

alter table table_name add index index_name(column_name)

唯一索引:

alter table table_name add unique un_name(column_name);

主键索引:

alter table table_name add primary key key_name(column);

普通索引和唯一索引:

create table index index_name on table_name(column)

注意:create命令无法创建主键索引

删除索引:

drop index index_name on table_name

alter table table_name drop index index_name

alter table table_name drop primary_key

注意:drop无法删除主键索引

查看索引:

show index from table_name


1.3 mysql视图

定义:是一个临时表,跟随表变化

优点:常用数据放到视图中,读取速度更快

创建视图:

create view view_name as select * from table_name;


1.4 mysql内置函数

字符串函数:

concat(string1[,...]) //连接字符串

lcase(string1) //转换成小写

ucase(string2) //转换成大写

length(string) //字符串长度

ltrim(string) //取出前端空格

rtrim(string) //取出后端的空格

repeat(string, count) //重复count次

replace(str, search_str, replace_str) //在str中把search——str用replace——str替换

substring(str,position[,length]) //在str的position开始读取length个字符,注意position从1开始计算

space(count) //生成count个空格

数学函数:

bin(decimal_number) //十进制转二进制

ceiling(number) //向上取整

floor(number) //向下取整

max(num1, num2) //取最大值

min(num1, num2) //取最小值

sqrt(number) //开平方

rand() //返回0-1内的随机数

日期函数:

curdate() //返回当前日期

curtime() //返回当前时间

now() //返回当前日期时间

unix_timestamp(date) //返回当前日期的时间戳

from_unictime() //返回时间戳的日期型

week(date) //返回date中的第几周

year(date) //返回date中的第几年

datediff(date1,date2) //返回date1,date2之间的天数


1.5 预处理语句

创建预处理语句:

prepare stmt1 from 'select * from user where id > ?''

设置变量:

set @i=1

执行语句:

execute stmt1 using @i


1.6 mysql事务处理

关闭自动提交功能:

set autocommit = 0;

从表中删除一条记录

delete from table where id = 1;

设置一个还原点

savepoint p1;

再次从表中删除一条记录

delete from table where id = 2;

再次做一个还原点:

savepoint p2

恢复到p1还原点,此时p2失效

rollback to p1

退回到最原始的还原点

rollback


1.7 mysql存储

定义:一个存储代码的区域,相当于函数

使用场景:创建100个用户

命令:

\d //

create procedure procedure_name()

begin

set @i=1;

while @i<=100 do

insert into table(name) values(concat('user',@i));

set @i=@i+1;

end while

end//

执行存储:

call procedure_name()

查看存储:

show procedure status


1.8 mysql触发器

定义:一个时间发生,同时引发另一个事件发生

命令:

创建:

\d //
create trigger t1 before insert on t1 for each row
begin
insert into t2(name) values(new.name);
end//
\d ;

作用:插入数据到表中,相关的表也会插入数据

\d //
create trigger t1 before delete on t1 for each row
begin
delete from t2 where id = old.id
end//
\d ;

作用:删除表中的数据,另一个表跟着删除

\d //
create trigger t1 before update on t1 for each row
begin
update t1 set name = (new.name) where name=(old.name);
end//
\d ;

删除触发器:

drop trigger trigger_name;

查看:

show triggers


1.9 重排auto_increment值

清空表不能用delete,而是用truncate

使用命令修改auto_increment

alter table table_name auto_increment = 1



2.常用的sql技巧:

2.1 正则表达式的使用

^ 在字符串的开始进行匹配

& 在字符串的结束进行匹配

. 匹配任意的当个字符

[..] 匹配出括号内的任意字符

[^..] 匹配不出现括号内的任意字符

a* 匹配0个或者多个a

a+ 匹配一个或者多个a

a? 匹配0个或者1个a

a1|a2 匹配a1或者a2

a(m) 匹配m个a

a(m,) 匹配至少m个a

a(m,n) 匹配m到n个a

a(,n) 匹配0到n个a

(...) 将模式元素组成单一元素


2.2 利用rand()提取随机行

select * from user order by rand() limit 10;


2.3 利用group by的with rollup统计更多信息

select name,count(name) from user group by name


2.4 使用外键需要注意

myisam不支持外键,innodb支持外键

形成依赖关系,删除时必须先删除外键对应的记录


2.5 忘记某个命令时使用命令提示命令

? create

? help

? %

? contends

? crea%

\G 在语句后面加上这个代表行列倒写


3 sql语句的优化

3.1 通过show status了解sql的执行效率

命令:

show [session|global]status

其中session代表当前连接,global代表数据库启动至今

show status like 'com_%';

show global status like 'com_%';

innodb存储引擎:

show status like "innodb_rows%";


3.2 特殊查询

show like "connections" //数据库连接数

show like "uptime" //数据库开启了多久

show like "slow_queries" //慢查询次数


3.3 定位执行效率低的sql语句

1)查询慢查询日志

2)使用desc或explain命令。查看rows,select_type,


3.4 索引问题

索引是解决sql性能问题最重要的手段之一,用于快速查找出在某个列中有一特定值的行。

使用场景:在被经常用来当条件的字段

索引使用注意:

1)创建的是复合索引,只要查询条件中用到最左边的列,索引一般会被使用

2)使用like查询,后面是常量并且’%‘不在第一个字符,索引一般能被调用

3)如果是对大文本进行索引,使用全文索引,而不用like

4) 如果列名是索引,则column_name is null或者column_name is not null使用索引

5)如果使用or或者and并列条件,如果有一个条件没有索引则不使用索引

6)如果列值是一个字符串,但在查询时把一个数值付给它则放弃使用索引


查看索引使用情况:

show status like 'handler_read%';

handler_read_key:如果索引正在工作,它的值会很高,代表了一个索引行被当做索引读的次数

handler_read_rnd_next: 值越高,说明查询低效,应该建立索引补救


3.5 对表进行优化

检查表是否存在语法错误

命令:check table table_name

定期优化表:

如果已经删除了表中的一大部分数据,或者对可变长度行的表做了多次变动,则需要将空间碎片进行整合优化

命令:optimize table sales(避免在访问时间使用该命令)


3.6 大量数据的快速导入和导出

导出:

select column_name from table outfile into 'test.txt'

导入:

load data infile 'test.txt' into table table_name(column_name)

打开或者关闭非唯一索引

alter table table_name disable keys

alter table table_name enable keys

关闭自动提交:

set autocommit = 0

load data infile 'test.txt' into table table_name(column_name)

set autocommit = 1


3.7 insert 优化

使用一次插入多个值来代替一次插入一个值。执行一次语句数据库开关一次


3.8 group by 优化

使用group by 则会自动进行排序,所以为了不让排序损耗资源,使用order by null来禁止排序


3.9 多表查询优化

使用左连接或者右连接来替代嵌套查询


4.数据库优化

4.1 表的优化

在不使用事务和外键的情况下,都使用mysiam存储引擎建立表

4.2 通过拆分来提高表的访问速度

4.3 使用中间表来提高统计查询的速度


5.mysql服务器的优化

5.1 mysiam读锁定和写锁定

读锁:只能读不能写

写锁:既不能读也不能写,只有自己那端能读写

命令:

lock table table_name read

lock table table_name write

unlock tables

总之,myisam会自行进行锁操作,无需自己指定,只有备份数据时需要自行读锁定


5.2 四种字符集问题

查看字符集:\s

1)server character  utf8

2) database character utf8

3) client character utf8

4) conn character utf8

mysql配置文件中:

cient和conn:default-character-set=utf8

server,database,table: character-set=utf8

校验字符集(针对排序):colltion-server=utf8_general_ci


5.3 开启binlog日志(默认开启)

show variables like '%bin%';

配置文件中my.conf:

log-bin=mysql-bin


5.4 慢查询日志:

show variables like '%slow%';

show variables like '%long%';

配置文件my.conf添加:

log_slow_queries=slow.log

long_query_time=5


5.5 socket问题:

连接mysql时需要使用

配置文件my.conf

[client]

port=3306

socket=/tmp/mysql.sock

[mysqld]

port=3306

socket=/tmp/mysql.sock

如果socket文件丢失,会造成用户无法登陆


5.6 root密码丢失

//关闭服务进程

1.service mysqld stop

//跳过授权表

2.mysqld_safe --skip-grant-tables --user=mysql &

3.mysql -uroot

4.update userset password=password('123') where user='root' and host='localhost';


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post