您的位置:首页 > 数据库 > MySQL

MySQL性能优化

2015-08-03 22:47 686 查看
MySQL性能优化

第一集 Mysql基础操作-1

@基础操作

linux 内部 mysql 根目录

1.表复制

复制表结构+表数据

desc tables_name;

insert into t1(name) values('user');

@1.create table new_table like old_table;

@2.insert into t2 select * from t1;

(可能有问题,必须表结构一模一样)

//insert into t2 select name,value from t1;

复制若干列,选择相应的列

2.索引 mysql>?index

show index from table_name;查看索引

通用方法:ALTER

ALTER TABLE table_name ADD[DROP] INDEX (index_name);

ALTER TABLE table_name ADD[DROP] UNIQUE (column_list);

ALTER TABLE table_name ADD[DROP] PRIMARY KEY (column_list);

自增列必须是主键

必须先alter table t1 modify id int unsigned not null;

create 与 drop 不能创建对主键索引

CREATE INDEX index_name ON table_name(column_list);

CREATE UNIQUE INDEX index_name ON table_name(column_list);

@唯一索引不能有重复值

drop INDEX index_name ON table_name(column_list);

===========================================

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

调成自增主键

alter table t1 modify id int unsigned not null auto_increment;;

3.视图?>view

[临时缓冲区]从完整的表中获取部分表

create view v_t1_condition as select * from t1 whare id>4 and id<11;

insert into t1(name) values("A"),("B"),("C");

show tables;

根据条件时时刻刻的跟踪最新结果(真正表变化时自动更新);

drop view v_t1_condition;

v_t1 为空或失败:视图不会随原表删除而删除;

4.内置函数

4.1字符串函数

连接字符串

select CONCAT("hello","world") as my_name;

转换成小写LCASE("HELLO")

转换成大写UCASE("world")

LENGTH(string) 字符串长度

LTRIM(String) 去除前端空格

RTRIM(String) 去除后端空格

REPEAT(String2,count) 重复count次

REPLACE(str,search_str,replace_str)

在str中用replace_str代替search_str

substring("hello world",1,5) 重1开始数数取出5个

SPACE(count) 生成count个空格

4.2数学函数

BIN(decimal_number) 十进制转二进制

CEILING(number) 向上取整

FLOOR(number) 向下取整

max(column) 取最大值 聚合时使用

min(column) 取最小值

sqrt(number2) 开平方

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

select * from t1 order by rand();

UNIX_TIMESTAMP(date) 返回当前date的UNIX时间戳

FROM——UNIXTIME() 返回unix时间戳的日期值

week(date) 返回date为一年中的第几周

year(date) 返回date的年份

dateDIFF(expr,expr2) 返回开始时间和介绍时间的天数

4.3其他函数

日期函数

curdate() 当前日期

curtime() 当前时间

now() 当前日期时间

5.预处理语句

语言只支持数据库语言的一部分

设置预处理,传递一个数据作为一个where判断条件;

?prepare

prepare stm1 from 'select * from t1 where id > ?';

设置一个变量> set @i=1

执行预处理》execute stm1 using @i;

>set @i=5;

>executed stm1 using @i;

删除预处理>drop perpare stm1;

6.事务处理

关闭自动处理》set autocommit = 0;

》delete from t1 where id = 10;

》savepoint p1;

》delete from t1 where id =10;

》savepoint p2;

》roolback to p1;

》rollback;//commit

show create table t1;

@engine = myISAM 这个引擎不支持事务

alter table t1 engine=innodb;

select @@autocommit;

savepoint p3;

rollback to p3;

7.储存《代码段》

》?procedure;

》\d //

》create procedure p2()

>begin

>set @i=3;

>while @i<100 do

> insert into t2(name) values (concat ("user",@i));

> set @i=@i+1;

> end while;

> end//

》show produre status;

》show create produce p2;

》call p2();

8.触发器

修改delimiter 为 //

同步更新数据

触发一个动作修改另外一张表;

》\d //

》create trigger tg1 before 【insert】 on t1 for each row

>begin

>insert into t2(name) vaues(new.name);

>end //

》\d ;

delete from 删除数据一条一条删

truncate t2;直接擦除数据表;auto_increment自增列表删除

》show triggers;

where id = old.id;主动表有的值!注意key的对称

show triggers;

9.重排auto_increment

truncate table tablename;

alter table t1 auto_increment=1;

@常用SQL技巧

2.1正则表达式的使用

?regexp

select "linux is very good" regexp ".*";

"^":字符串开始处

"$":字符串结尾处

. [...] A* == {0,} A+ == {1,}

》》》》javascript 正则表达式

》》》》sed perl 正宗正则表达式

select * from where email REGEXP "@163[.,]com$"

where email like "%@163.com" or email like "%@163,com"

2.2巧用Rand()提取随机行:随机排序

select * from stu order by and() limit 3;

2.3 GROUP BY的with rollup 更多的合集信息

select * from demo;不可以与order by同时使用

select cname,pname,count(pname)

from demo group by cname,pname with rollup;

| bg | null | 5

|null|null | 9

查看聚合了多少次

2.4 bit group function

select id,bit_or(kind) from order_rab group by id;

select id,bit_and(kind) from order_rab group by id;

2.5 使用外键

2.6 帮助:

?%

?opti%

?contents;

\c

\G 把行列互换

@SQL语句优化

1.一般步骤

》show [session表示当前连接|global数据库启动至今] status;

》show Status;增删改查的记录

》show global status;

》show status like 'Com_%';

【com_select,delete,update,insert】

》show gloabl status like 'Com_%';

InnoDB_rows_read,update,insert,deleted 执行select影响的行数

connetcions 连接次数

Uptime 服务器工作的秒数

slow_queries 慢查询的次数

show variables like "%slow%";

show variables like "%long%";

2.定位执行效率低下的语句

》desc select * from t1 \G;

》explain select * from table_name;

单表还是多表查询;

普通索引,唯一索引,主键索引

!影响行数;!查询类型!;索引使用

@数据库级别优化[!一定要降低影响行数!]

1,索引优化---SELECT操作

MyISAM-数据和索引自动分开存储-各自独立【三个文件】

InnoDB-表与索引存储在同一个表中;

目前不支持函数索引,只能取一列前4个字节进行索引;

共性表空间与独立表空间;

alter table t1 add index in_name(name);

索引什么时候用得上,什么时候用不上?

like "%3"

只有%号不在第一个字符,所应才可能被使用

MYISAM表引擎已经很优化了,InnoDB;

%符号尽量往后写,前面不要写;写在最前用不上索引

查找NULL值时:where name is null;

@@@存在索引却用不上

》mysql主动判断选择放弃索引使用,例如大范围扫描

》where name ?or and id = ?

》》两个判断都需要加索引,name与id都需要索引;

》varchar类型(注意原始字段类型)

where name = ‘123’

where name = 123;

》show status like "Handler_read%";

read_and_next 值越高越需要索引,查询效率越低

所应正在工作:handler_read_key值将会很高

》show status like "handler_read%";

@表优化!

create view v_t1 as select * from t1 where id > 2;

检查一个或多个表是否有错误:分析表

check table tb1_name option =

{QUICK,FAST,MEDIUM,EXTENDED,CHANGED}

》check table sales;

优化表空间,剔除碎片与空间;

optimize [LOCAL|NO_WRITE_TO_BINLOG] table tb1_name;

》optimize table sales;

@ 常用SQL优化

1.大批量插入数据

数据导入导出:

mysqldumb 导出了mysql语句;速度很慢

?infile

?outfile

?load data

》load data infile “tmp/test.txt”

》select name from t1 into outfile "/tmp/test.txt";

》load data infile "/tmp/test.txt" into table t1(name);

》ALTER TABLE tb1_name DISABLE KEYS

loading the data。。。。插入一千万行数据中

》ALTER TABLE tb1_name ENABLE KEYS

》show index from t1;

唯一索引最好别关(load时会报错),普通索引与唯一索引;

set unique_checks = 0;关闭唯一索引

set unique_checks = 1;开启唯一索引

@InnoDB按照主键顺序导出表,导入时会更快

@InnoDB set autocommit = 0;

@set autocommit = 1;

2.优化insert语句

@。使用 insert delayed 语句

》insert into t1(name) values("user4");

每执行一次连接关闭一次;

insert into t1(name) values("user4"),("user5");

链接一次插入两个数据;

mysqldumb 导入时已经完成连续插入优化;

load date 比 mysql dumb 快20倍左右;

3.优化Group By语句

order by null 禁止排序,避免默认排序结果的损耗;

desc select * from t1 groub by class;

4.优化嵌套查询

多表查询

select * from t1 where id in (select uid from t2);

外表查询没有用到任何索引;

where t1.id = t2.id;

左连接查询;

尽量不要用嵌套查询;

@。将索引文件和数据文件分别存放在不同的磁盘上

ANALYZE

======================================

@Myisam表锁

=======================================

数据库优化

1.表的类型

2.通过拆分提高表的访问效率,节省CPU资源

3.使用中间表提高查询速度

【查询出热门贴】-> 建立中间表;

或创建相关视图【更推荐使用】;

字段优化::::人为优化

=======================================

分库分表;分区;

目的:减少表的记录数;减少对操作系统的负担压力

=======================================

@服务器级别优化

1. mysql表复制

2. mysql索引

3. mysql视图

4. mysql内置函数

第二集 Mysql基础操作-2

5.mysql预处理语句

6.mysql事务处理

7.mysql存储

8.mysql触发器

9.重排auto_increment值

第三集 Mysql Sql语句技巧与优化

1.Mysql Sql语句技巧

1).正则表达式的使用

2).巧用RAND()提取随机行

3).利用GROUP BY的WITH ROLLUP子句统计

4).用BIT GROUP FUNCTIONS做统计

5).使用外键需要注意的问题

6).mysql中help的使用

2.Mysql Sql语句优化

1).优化Sql语句优化的一般步骤

第四集 Mysql索引优化

1.索引优化

2.表检查与表优化

1) check表检查

2) optimize表优化

3.常用sql的优化

1) 大批量导入数据

2) insert优化

3) group by优化

4) 嵌套查询优化

第五集 数据库优化与服务器优化

1.数据库优化

1) 优化表的类型

2) 分库分表

3) 分区技术

4) 使用中间表提高统计查询速度

2.mysql服务器优化

========================================

1) myisam表锁

1.读锁定

lock table t1 read;

select * from t1;

unlocak tables;

所有人都写不了,但都可以读

2.写锁定

我可以读写,其他人读都读不了;

2) 四种字符集问题

utf-8;

Server-characterset;

Db-characterset;

conn-characterset;

client-characterset;

utf-8_general-ci 校验字符集针对排序;

3) binary log日志问题

》show variables like "%bin%";

log_bin ON

》show binary logs;

》CONF:log-bin = mysql-bin;

4) slow log慢查询日志

show variables like "%slow%";

show variables like "%long%";

vi /etc/my.cnf

logs_slow_queries = slow.log

long_query_time=5

pkill mysqld;

netstat -tunpl | grep 3306

5) socket丢失问题

不知道往哪台主机的哪个端口连

[client]

port=3306

socket=/tmp/mysql.sock

[mysqld]

port=3306

socket=/tmp/mysql.sock

skip-locking

===========================

myql -u root -p 123 --protocol tcp -h localhost

服务重新启动即可;

6) root密码破解

1.service mysqld stop

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

3.mysql -uroot

//4.set password=password("password");

5.update mysql.user set password=password("password")

where user='root' and host='localhost';

[或]6.set password for root@localhost=password("password");

[或]7.set password=password("password");

select database();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: