MySQL数据库优化详解

mysql表复制

复制表结构+复制表数据

mysql> create table t3 like t1;
mysql> insert into t3 select * from t1;

mysql索引

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADDPRIMARY KEY (column_list)
Create Index
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
drop index
DROP INDEX index_name ON talbe_name
alter table table drop
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY

mysql视图

创建视图

mysql> create view v_t1 as select * from t1 where id>4 and id<11;
Query OK, 0 rows affected (0.00 sec)

view视图的帮助信息

mysql> ? view
ALTER VIEW
CREATE VIEW
DROP VIEW

查看视图

mysql> show tables;

删除视图v_t1

mysql> drop view v_t1;

mysql内置函数

字符串函数

CONCAT (string2 [,… ]) //连接字串
LCASE (string2 ) //转换成小写
UCASE (string2 ) //转换成大写
LENGTH (string ) //string长度
LTRIM (string2 ) //去除前端空格
RTRIM (string2 ) //去除后端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
SPACE(count) //生成count个空格

数学函数

BIN (decimal_number ) //十进制转二进制
CEILING (number2 ) //向上取整
FLOOR (number2 ) //向下取整
MAX(num1 ,num2) //取最大值
MIN(num1,num2) //取最小值
SQRT(number2) //开平方
RAND() //返回0-1内的随机值

日期函数

CURDATE() //返回当前日期
CURTIME() //返回当前时间
NOW() //返回当前的日期时间
UNIX_TIMESTAMP(date) //返回当前date的UNIX日间戳
FROM_UNIXTIME() //返回UNIX时间戳的日期值
WEEK(date) //返回日期date为一年中的第几周
YEAR(date) //返回日期date的年份
DATEDIFF(expr,expr2) //返回起始时间expr和结束时间expr2间天数

mysql预处理语句

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

mysql> prepare stmt1 from 'select * from t1 where id>?';

设置一个变量
mysql> set @i=1;
执行stmt1预处理
mysql> execute stmt1 using @i;
设置@i为5
mysql> set @i=5;
再次去执行stmt1
mysql> execute stmt1 using @i;
如何删除预处理stmt1
mysql> drop prepare stmt1;

mysql事务处理

--关闭自动提交功能
mysql> set autocommit=0;
--从表t1中删除了一条记录
mysql> delete from t1 where id=11;
--此时做一个p1还原点:
mysql> savepoint p1;
--再次从表t1中删除一条记录:
mysql> delete from t1 where id=10;
--再次做一个p2还原点:
mysql> savepoint p2;
--此时恢复到p1还原点,当然后面的p2这些还原点自动会失效:
mysql> rollback to p1;
--退回到最原始的还原点:
mysql> rollback ;

mysql存储

创建一个存储p1()

mysql> \d //
mysql> create procedure p1()
-> begin
-> set @i=0;
-> while @i<10 do
-> select @i;
-> set @i=@i+1;
-> end while;
-> end;
-> //

执行存储p1()

mysql> \d ;
mysql> call p1();
--查看procedure p1()的status信息
mysql> show procedure status\G
--查看procedure p1()的具体信息:
mysql> show create procedure p1\G

mysql触发器

修改delimiter为//
mysql> \d //
创建一个名字为tg1的触发器,当向t1表中插入数据时,就向t2表中插入一条数据

mysql> create trigger tg1 before insert on t1 for each ro
>begin
>insert into t2(id) values(new.id);
>end//
--准备两个空表t1和t2
mysql> select * from t1;
mysql> select * from t2;
--向t1表中插入多条数据:
mysql> insert into t1 values(1),(2),(3),(4);

如何制作删除表t1后t2表中的记录也会跟着删除呢
mysql>\d //
mysql> create trigger tg2 beforedelete on t1 for each row
>begin delete from t2 where id=old.id;
>end//
mysql>\d ;
如何制作更改表t1后t2表中的记录跟着个性呢
mysql>\d //
mysql> create trigger tg3 beforeupdate on t1 for each row
>begin update t2 set id=new.id where id=old.id;
>end//
mysql>\d ;
查看触发器
mysql> show triggers;

重排auto_increment值

MYSQL数据库自动增长的ID如何恢复,清空表的时候。不能用

delete from tablename;
而是要用:

truncatetable tablename;
这样auto_increment 就恢复成1了

或者清空内容后直接用ALTER命令修改表:

altertable tablename auto_increment =1;

利用GROUP BY的WITH ROLLUP

mysql> select * from demo;
+-------+-------+
| cname | pname |
+-------+-------+
| bj | hd |
| bj | xc |
| bj | hd |
| sh | dh |
| sh | rg |
| sh | dh |
+-------+-------+
9 rows in set (0.00 sec)

对demo表按照cname、pname列分组对pname列进行聚合计算如下

mysql> select cname,pname,count(pname) from demo group by
cname,pname;
+-------+-------+--------------+
| cname | pname | count(pname) |
+-------+-------+--------------+
| bj | hd | 3 |
| bj | xc | 2 |
| sh | dh | 3 |
| sh | rg | 1 |
+-------+-------+--------------+
4 rows in set (0.00 sec)

同样使用with rollup关键字后,统计出更多的信息,如下。注意:with rollup不可以和ordery by同时使用

ysql> select cname,pname,count(pname) from demo group by cname,pname
with rollup;
+-------+-------+--------------+
| cname | pname | count(pname) |
+-------+-------+--------------+
| bj | hd | 3 |
| bj | xc | 2 |
| bj | NULL | 5 |
| sh | dh | 3 |
| sh | rg | 1 |
| sh | NULL | 4 |
| NULL | NULL | 9 |
+-------+-------+--------------+
7 rows in set (0.00 sec)

使用外键需要注意的问题

创建外键的方式

mysql>create table temp( id int, name char(20), foreign key(id)
references outTable(id) on delete cascade on update cascade);

注意:Innodb类型的表支持外键,myisam类型的表,虽然创建外键可以成功,但是不起作用,主要原因是不支持外键。

优化SQL语句的一般步骤

通过show status命令了解各种SQL的执行频率

mysql> show [session|global]status;

其中:session(默认)表示当前连接,global表示自数据库启动至今

mysql>show status;
mysql>show global status;
mysql>show status like ‘Com_%';
mysql>show global status like ‘Com_%';

参数说明:

Com_XXX表示每个XXX语句执行的次数如:
Com_select 执行select操作的次数,一次查询只累计加1
Com_update 执行update操作的次数
Com_insert 执行insert操作的次数,对批量插入只算一次。
Com_delete 执行delete操作的次数
只针对于InnoDB存储引擎的:

InnoDB_rows_read 执行select操作的次数
InnoDB_rows_updated 执行update操作的次数
InnoDB_rows_inserted 执行insert操作的次数
InnoDB_rows_deleted 执行delete操作的次数
其他:

connections 连接mysql的数量
Uptime 服务器已经工作的秒数
Slow_queries:慢查询的次数
定位执行效率较低的SQL语句

explain select * from table where id=1000;
desc select * from table where id=1000;

通过EXPLAIN分析较低效SQL的执行计划

mysql> explain select count(*) from stu where name like "a%"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: stu
type: range
possible_keys: name,ind_stu_name
key: name
key_len: 50
ref: NULL
rows: 8
Extra: Using where; Using index
1 row in set (0.00 sec)

每一列的简单解释

id: 1
select_type: SIMPLE 表示select的类型,常见的取值有SIMPLE()简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SESECT)等
table: stu  输出结果集的表
type: range 表示表的连接类型,性能有好到差:system(表仅一行)、const(只一行匹配)、eq_ref(对于前面的每一行使用主键和唯一)、ref(同eq_ref,但没有使用主键和唯一)、ref_or_null(同前面对null查询)、index_merge(索引合并优化)、unique_subquery(主键子查询)、index_subquery(非主键子查询)、range(表单中的范围查询)、index(都通过查询索引来得到数据)、all(通过全表扫描得到的数据)
possible_keys: name,ind_stu_name 表查询时可能使用的索引。
key: name  表示实际使用的索引。
key_len: 50 索引字段的长度
ref: NULL
rows: 8 扫描行的数量
Extra: Using where; Using index 执行情况的说明和描述

索引问题

MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独一的一个文件;InnoDB存储引擎的表的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以只取name的前4个字符进行索引,这个特性可以大大缩小索引文件的大小,用户在设计表结构的时候也可以对文本列根据此特性进行灵活设计。

mysql>create index ind_company2_name on company2(name(4));

--其中company表名ind_company2_name索引名
MySQL如何使用索引
1、使用索引

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

mysql>create index ind_sales2_com_mon on sales2(company_id,moneys);

然后按company_id进行查询,发现使用到了复合索引

mysql>explain select * from sales2 where company_id=2006\G

使用下面的查询就没有使用到复合索引。

mysql>explain select * from sales2 where moneys=1\G

(2) 使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如下:

mysql> explain select * from company2 where name like "%3"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: company2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
1 row in set (0.00 sec)

如下这个使用到了索引,而下面例子能够使用索引,区别就在于“%”的位置不同,上面的例子是吧“%”放在了第一位,而下面的例子则没有

mysql> explain select * from company2 where name like "3%"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: company2
type: range
possible_keys: ind_company2_name
key: ind_company2_name
key_len: 11
ref: NULL
rows: 103
Extra: Using where
1 row in set (0.00 sec)

(3)如果对大的文本进行搜索,使用全文索引而不使用like“%...%”.

(4)如果列名是索引,使用column_name is null将使用索引。如下

mysql> explain select * from company2 where name is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: company2
type: ref
possible_keys: ind_company2_name
key: ind_company2_name
key_len: 11
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)

存在索引但不使用索引
(1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_part1均匀分布在1到100之间,查询时使用索引就不是很好

mysql>select * from table_name where key_part1>1 and key_part<90;

(2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。

(3)用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

mysql>show index from sales\G
*************************** 1. row ***************************
……
key_name: ind_sales_year
seq_in_index:1
Column_name: year
……

从上面可以发现只有year列上面有索引。来看如下的执行计划。

mysql> explain select * from sales where year=2001 or country=‘China'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales
type: ALL
possible_keys: ind_sales_year
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra: Using where
1 row in set (0.00 sec)

(4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中这个索引也不会被MySQL采用。

mysql> explain select * from sales2 where moneys=1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
1 row in set (0.00 sec)

(5)如果like是以%开始,可见虽然在name上面建有索引,但是由于where 条件中like的值的“%”在第一位了,那么MySQL也会采用这个索引。

(6)如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name列上有索引,但是也没有用到。

mysql> explain select * from company2 where name name=294\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: company2
type: ALL
possible_keys: ind_company2_name
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
1 row in set (0.00 sec)

而下面的sql语句就可以正确使用索引。

mysql> explain select * from company2 where name name=‘294'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: company2
type: ref
possible_keys: ind_company2_name
key: ind_company2_name
key_len: 23
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)

查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数。

Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。

mysql> show status like 'Handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 0 |
| Handler_read_key | 5 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 2055 |
+-----------------------+-------+
6 rows in set (0.00 sec)

两个简单实用的优化方法

分析表的语法如下:(检查一个或多个表是否有错误)

mysql> CHECK TABLE tbl_name[,tbl_name] …[option] …option =
{ QUICK | FAST | MEDIUM| EXTENDED | CHANGED}
mysql> check table sales;
+--------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+-------+----------+----------+
| sakila.sales | check | status | OK |
+--------------+-------+----------+----------+
1 row in set (0.01 sec)

优化表的语法格式:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name]
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM、BDB和InnoDB表起作用。

mysql> optimize table sales;
+--------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+----------+----------+----------+
| sakila.sales | optimize | status | OK |
+--------------+----------+----------+----------+
1 row in set (0.05 sec)

常用SQL的优化

大批量插入数据
当用load命令导入数据的时候,适当设置可以提高导入的速度。

对于MyISAM存储引擎的表,可以通过以下方式快速的导入大量的数据。

ALTER TABLE tbl_name DISABLE KEYS
loading the data
ALTER TABLE tbl_name ENABLE KEYS
DISABLE KEYS 和ENABLE KEYS 用来打开或关闭MyISAM表非唯一索引的更新,可以提高速度,注意:对InnoDB表无效。

--没有使用打开或关闭MyISAM表非唯一索引:

mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2;
Query OK,529056 rows affected (1 min 55.12 sec)
Records:529056 Deleted:0 Skipped:0 Warnings:0

--使用打开或关闭MyISAM表非唯一索引:

mysql> alter table film_test2 disable keys;
Query OK,0 rows affected (0.0 sec)
mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2;
Query OK,529056 rows affected (6.34 sec)
Records:529056 Deleted:0 Skipped:0 Warnings:0
mysql> alter table film_test2 enable keys;
Query OK,0 rows affected (12.25 sec)

--以上对MyISAM表的数据导入,但对于InnoDB表并不能提高导入数据的效率

(1)针对于InnoDB类型表数据导入的优化

因为InnoDB表的按照主键顺序保存的,所以将导入的数据主键的顺序排列,可以有效地提高导入数据的效率。

--使用test3.txt文本是按表film_test4主键存储顺序保存的

mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;
Query OK, 1587168 rows affected (22.92 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0
--使用test3.txt没有任何顺序的文本(效率慢了1.12倍)

mysql> load data infile ‘/home/mysql/film_test4.txt'into table film_test4;
Query OK, 1587168 rows affected (31.16 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0

(2)关闭唯一性效验可以提高导入效率

在导入数据前先执行set unique_checks=0,关闭唯一性效验,在导入结束后执行set unique_checks=1,恢复唯一性效验,可以提高导入效率。

--当unique_checks=1时

mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;
Query OK,1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0

--当unique_checks=0时

mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;
Query OK,1587168 rows affected (19.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0

(3)关闭自动提交可以提高导入效率

在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入结束后执行set autocommit=1,恢复自动提交,可以提高导入效率。

--当autocommit=1时

mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;
Query OK,1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0

--当autocommit=0时

mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;
Query OK,1587168 rows affected (20.87 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0

优化insert语句
尽量使用多个值表的insert语句,这样可以大大缩短客户与数据库的连接、关闭等损耗。

可以使用insert delayed(马上执行)语句得到更高的效率。

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

可以增加bulk_insert_buffer_size 变量值的方法来提高速度,但是只对MyISAM表使用当从一个文件中装载一个表时,使用LOAD DATA INFILE。这个通常比使用很多insert语句要快20倍。

优化group by语句
如果查询包含group by但用户想要避免排序结果的损耗,则可以使用使用order by null来禁止排序:

如下没有使用order by null来禁止排序

mysql> explain select id,sum(moneys) from sales2 group by id\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using temporary;Using filesort
1 row in set (0.00 sec)

如下使用order by null的效果:

mysql> explain select id,sum(moneys) from sales2 group by id order by null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using temporary
1 row in set (0.00 sec)

优化嵌套查询
下面是采用嵌套查询的效果(可以使用更有效的链接查询(Join)替代)。

mysql> explain select * from sales2 where company_id not in(select id
from company2)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales2
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
1 row in set (0.00 sec)
*************************** 2. row ***************************
id: 2
select_type: SIMPLE
table: company2
type: index_subquery
possible_keys: ind_company2_id
key: ind_company2_id
key_len: 5
ref: func
rows: 2
Extra: Using index
1 row in set (0.00 sec)

下面是使用更有效的链接查询(Join)

mysql> explain select * from sales2 left join company2 on
sales2.company_id = company2.id where sales2.company_id is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sales2
type: ALL
possible_keys: ind_sales2_companyid_moneys
key: ind_sales2_companyid_moneys
key_len: 5
ref: count
rows: 1
Extra: Using where
1 row in set (0.00 sec)
*************************** 2. row ***************************
id: 2
select_type: SIMPLE
table: company2
type: index_subquery
possible_keys: ind_company2_id
key: ind_company2_id
key_len: 5
ref: func
rows: 1
Extra:
1 row in set (0.00 sec)

从执行计划中可以明显看出查询扫描的记录范围和使用索引的情况都有了很大的改善。连接(JOIN)子所以更有效率一些,是因为MySQL不需要再内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

数据库优化

优化表的类型
在MySQL中,可以使用函数PROCEDUREANALYSE()对当前应用的表进行分析,改函数可以对数据表中列的数据类型提出优化建议,用户可以根据应用的实际情况酌情考虑是否实施优化。

mysql> select * from duck_cust procedure analyse()\G
*************************** 1. row ***************************
Field_name: sakila.duch_cust.cust_num
Min_value: 1
Max_value: 6
Min_length: 1
Max_length: 1
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 3.5000
Std: 1.7078
Optimal_fieldtype: ENUM(‘1',‘2',‘3',‘4') NOT NULL
*************************** 2. row ***************************
……

大存储量解决
1.分库分表

2.分区

主要目的:

1.减少表的记录数

2.减小对操作系统的负担压力

中间表
中间表的产生:
1.view 视图
2.重新生成一个新表

Mysql服务器优化

myisam读锁定
1.

lock table t1 read
2.开启另一个mysql连接终端,接着去尝试:

select * from t1
3.再insert、update和delete t1这张表,你会发现所有的数据都停留在终端上没有真正的去操作

4.读锁定对我们在做备份大量数据时非常有用.

mysqldump -uroot -p123 test >test.sql
myisam写锁定
1.

lock table t1 write
2.打开另一个mysql终端,尝试去select、insert、update和delete这张表t1,你会发现都不能操作,都会停留在终端上,只有等第一个终端操作完毕,第二个终端才能真正执行.

3.可见表的写锁定比读锁定更严格

4.一般情况下我们很少去显式的去对表进行read 和write锁定的,myisam会自动进行锁定的.

Mysql服务器优化

二进制日志
1.log-bin=mysql-bin

查看bin-log日志:

mysql> show binary logs;
查看最后一个bin-log日志:

mysql> show master status;
慢查询日志
开户和设置慢查询时间:

vi /etc/my.cnf
log_slow_queries=slow.log
long_query_time=5
慢查询次数:

mysql> show global status like "%quer%"
socket问题
mysql socket无法登录

1. 有时登录mysql时提示不能用socket登录,此时可以换成tcp方式去登录,但是可以测试时可以这样用,但是必须要在php去用之前把这个事情解决了.

[root@localhost mysql]# mysql -uroot -pwei --protocol tcp -hlocalhost
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.0.77-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

这样就可以登录,这样就不用mysql.sock来登录,而mysql.sock是启动mysqld服务时产生的

root密码丢失

root密码丢失破解

1.service mysqld stop
2. mysqld_safe --skip-grant-tables --user=mysql &
//跳过授权表mysql.user和mysql.db这些表
3. mysql -uroot
4. set password=password("wei");
//用这一条语句结果报错,就是因为加了--skip-grant-tables
4. mysql>update user set password=password("wei") where user='root'
and host='localhost';
5. mysql> set password for root@localhost=password("wei");
6. mysql> set password=password("wei");
//和第五步一样,都可能成功修改密码
时间: 2014-08-04

MySQL优化全攻略-相关数据库命令

接下来我们要讨论的是数据库性能优化的另一方面,即运用数据库服务器内建的工具辅助性能分析和优化.    ▲ SHOW    执行下面这个命令可以了解服务器的运行状态:   mysql >show status;   该命令将显示出一长列状态变量及其对应的值,其中包括:被中止访问的用户数量,被中止的连接数量,尝试连接的次数,并发连接数量最大值,以及其他许多有用的信息.这些信息对于确定系统问题和效率低下的原因是十分有用的.    SHOW命令除了能够显示出MySQL服务器整体状态信息之外,它还能够显示

mysql中优化和修复数据库工具mysqlcheck详细介绍

一.mysqlcheck简介 mysqlcheck客户端可以检查和修复MyISAM表.它还可以优化和分析表. mysqlcheck的功能类似myisamchk,但其工作不同.主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时.使用mysqlcheck的好处是不需要停止服务器来检查或修复表.使用myisamchk修复失败是不可逆的. Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE.REPAIR TABLE.

my.ini优化mysql数据库性能的十个参数(推荐)

今天刚好需要配置mysql 5.5.45,因为数据库量挺大的,所以必须优化,要不mysql真的不快. (1).max_connections: 允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. 默认数值是100,我把它改为1024 . (2).record_buffer: 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区.如果你做很多顺序扫描,你可能想要增加该值.默认

MySQL 数据库优化的具体方法说明

以下的文章主要描述的是MySQL数据库简单实用优化的具体方法的实现,中包括如何定期的表进行分析与检查, 以及如何正确对表进行定期的优化,以下就是具体方案的描述,希望在你今后的学习中会有所帮助. 1.定期分析表和检查表 分析表的语法如下: 复制代码 代码如下: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name[, tbl_name]... 以上语句用于分析和存储表的关键字分布,分析的结果将可以使得系统得到准确的统计信息,使得SQL能够生成正确的

mysql数据库查询优化 mysql效率第1/3页

提高MySQL 查询效率的三个技巧小结MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效.以下是我在使用过程中做的提高效率的三个有效的尝试. l        使用statement进行绑定查询 使用statement可以提前构建查询语法树,在查询时不再需要构建语法树就直接查询.因此可以很好的提高查询的效率. 这个方法适合于

mysql数据库优化总结(心得)

 1. 优化你的MySQL查询缓存在MySQL服务器上进行查询,可以启用高速查询缓存.让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一.当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的.但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它.在有些处理任务中,我们实际上是可以阻止查询缓存工作的. 复制代码 代码如下: // query cache does NOT work$r = mysql_query("SELECT username FROM user W

MySQL 联合索引与Where子句的优化 提高数据库运行效率

网站系统上线至今,数据量已经不知不觉上到500M,近8W记录了.涉及数据库操作的基本都是变得很慢了,用的人都会觉得躁火~~然后把这个情况在群里一贴,包括机器配置什么的一说,马上就有群友发话了,而且帮我确定了不是机器配置的问题,"深圳-枪手"热心人他的机器512内存过百W的数据里也跑得飞快,甚至跟那些几W块的机器一样牛(吹过头了),呵呵~~~ 在群友的分析指点下,尝试把排序.条件等一个一个去除来做测试,结果发现问题就出在排序部分,去除排序的时候,执行时间由原来的48秒变成0.3x秒,这是

优化Mysql数据库的8个方法

1.创建索引对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降.但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引.2.复合索引比如有一条语句是这样的:select * from users

mysql 数据库中my.ini的优化 2G内存针对站多 抗压型的设置

物理内存越大,设置就越大.默认为2402,调到512-1024最佳 innodb_additional_mem_pool_size=4M 默认为2M innodb_flush_log_at_trx_commit=1 (设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1) innodb_log_buffer_size=2M 默认为1M innodb_thread_concurrency=8 你的服务器CPU有几个就设置为几,建议用默认一般为8 key_buff

计算机二级考试MySQL常考点 8种MySQL数据库设计优化方法

MySQL数据库设计的8种优化方法,具体内容如下 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了.同样的,如果可以的话,我们应该使用MEDIUMINT而不是B

计算机二级考试MySQL知识点 常用MYSQL命令

计算机二级考试MySQL知识点基础篇,MYSQL常用命令,具体如下 常用MYSQL命令(将计算机二级站点加入收藏夹) 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库:show databases; 选择数据库:use databaseName; 列出表格:show tables: 创建数据表:mysql> CREATE TABLE mytable (name VAR

MySQL几点重要的性能指标计算和优化方法总结

1 QPS计算(每秒查询数) 针对MyISAM引擎为主的DB MySQL> show GLOBAL status like 'questions'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | Questions | 2009191409 | +---------------+------------+ 1 row in set (0.00 sec) mysql

计算机二级考试MySQL知识点 mysql alter命令

mysql中alter命令的用法,用于编辑表结构.具体内容如下 修改字段类型 mysql> alter table employee change depno depno int(5) not null; 加索引 mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 -]); 例子: mysql> alter table employee add index emp_name (name); 加主关键字的索引 mysql> alter ta

计算机二级考试java软件操作教程 教大家如何学习java

Java并不难,只是包含的内容比较多.语言本身相当精练,但功能非常强大.为了能够更加有效地使用Java编制程序,你需要学习该语言所包含的库,其中的内容十分丰富.在本书中.你将依次了解语言如何运行以及如何应用它.学习这些内容的顺序经过精心地安排,通过一些相对简单.明了的过程,你就可以获得一定的专业知识,建立运用Java进行程序设计的信心.每一章都尽量避免使用你还没有学习到的东西.这样一来,你不能马上编写嵌入Weh网页的Java程序,但是这确实是一种诱人的想法,有点像冒险跳入深水学习游泳.一般说来,

mysql创建本地用户及赋予数据库权限的方法示例

前言 大家在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患. 这一点跟操作系统的用户管理也是类似的,多数人贪图方便都直接使用 administrator 或 root 用户,其实是一种不建议的做法. 那么,要如何在 mysql 中创建 root 之外的用户并赋予相应权限呢? 我们直接来看一个示例: CREATE USER 'golden'@'localhost' IDENTIFIED B

mysql同步问题之Slave延迟很大优化方法

一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制线程只有一个sql thread用于binlog的apply,所以难怪slave在高并发时会远落后master. ORACLE MySQL 5.6版本开始支持多线程复制,配置选项 slave_parallel_workers 即可实现在slave上多线程并发复制.不过,它只能支持一个实例下多个 da

ASP.NET 6种常用数据库的连接方法

1.C#连接连接Access 程序代码:     复制代码 代码如下: using   System.Data; using   System.Data.OleDb;    .. string   strConnection="Provider=Microsoft.Jet.OleDb.4.0;";     strConnection+=@"Data   Source=C:BegASPNETNorthwind.mdb"; OleDbConnection   objCo

计算机二级如何一次性通过?给NCRE焦躁心情降温!

距离我们计算机二级考试也就还有两个多月的时间了,可是一年当中最热的日子已经开始了!等考二级取证之路困难重重,虽说心静自然凉,但这备考大业未见成效,你有没有一种心静不下来的感觉啊? 不要着急下面就为大家分享计算机二级备考小妙招: 从自身入手,要保持清醒的头脑.计算机二级到现阶段应该如何备考,该听什么课.该针对哪些考点重点学习,这些都要做到心里有数,有计划性.先来说说题型: 1.选择题分析 选择题为单选题,是客观性试题,每道题的分值为2分,试题覆盖面广,一般情况下考生不可能做到对每个题目都有把握答对

Android中ListView的几种常见的优化方法总结

Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个textview: Activity: package com.alexchen.listviewoptimi