toxic

备忘录

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

清空表的所有数据

【低效方式:一条一条的删除】
DELETE FROM table_name;

【推荐方式:效率高】
TRUNCATE table_name;


正则表达式

SELECT name FROM t1  WHERE email  REGEXP "@163[.,].com$";

 

提取随机行

SELECT * FROM t1 ORDER BY RAND() LIMIT 3;【使用rand()函数会使程序的效率降低】


显示表结构

SHOW CREATE TABLE table_name;


利用GROUP BY 的 WITH ROLLUP(不可于ORDER BY 同时使用)

SELECT city_name,province_name,count(province_name) FROM t1 GROUP BY city_name,province_name WITH ROLLUP;【能够检索出来更多的信息,例如province_name为NULL的行也会检索出来,注意count(province_name)不可少】


SQL语句优化

 

优化SQL语句的一般步骤
1.通过show status 命令 了解各种SQL语句的执行频率
show [session|golbal]status;
其中session(默认)表示当前连接,global表示自数据库启动至今

show status;
show global status;
show status like 'Com_%';
一般查询以Com_insert%,Com_select%,Com_delete%,Com_update%开头的状态
show status like 'Com_select%';

【Com_XX】
Com_select 执行select的操作次数
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 慢查询次数

2.定位执行效率较低的语句
1)explain select * from table where id = 1000;
2)desc select * from table where id = 1000;
打印sql语句的执行信息
重点查看 possible keys(可能的索引),rows,Extra,key(索引)

3.学会使用慢查询日志

 

 

 

索引 一般用在条件后的字段 例如 where ,order by , having, group by
使用like查询时 后面如果是常量并且只有%号不再第一个字符,索引才有可能被使用
如果对大文本进行搜索,使用全文索引 而 不使用 like "%..%"
如果列名是索引 使用column_name is null 将使用索引

使用desc select * from t1 where...  来查看索引的使用情况

存在索引 但不使用索引
1. 如果mysql估计使用索引比全表扫描更慢,则不使用索引,例如 如果列key_part1 均匀分布在1到100之间,查询使用索引就不是很好
2. 如果使用MEMORY/HEAP表并且where条件中不使用"="进行索引列,那么讲不会用到索引
3. 用or或者and分割开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及的索引都不会被用到,除非or两边的条件字段全都有索引那么索引就会被使用
4.如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符串列名name,那么虽然在name列上有索引,将不会被使用

如果索引正在工作 那么handler_read_key的值将很高,这个值代表了一个行被索引值读取的次数,handler_read_rnd_next 的值高则意味着查询运行低效,并且应该建立索引,补救
show status like "handler_read%"

检测表是否有错误的语法
check table table_name

定期优化表(不要在负载很大的时候使用)
OPTIMIZE table table_name
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,则需要做定期优化,这个命令可以将表空间的碎片进行合并,但是此命令只对MyISAM,BDN和InnoDB表起作用.

大批量导入导出数据
  当用load命令导入数据的时候,适当设置可以提高导入的速度 ,对于MyISAM引擎的表 可以通过一下方式快速导入大量的数据
infile,outfile
导出
mysql> select name from t1 into outfile "tmp/test.txt";
导入数据
mysql> load data infile "/tmp/test.txt" into  table  t1(name)

关闭索引再导入数据 也能加速(对INNODB无效)(不建议关闭唯一索引)
alter table table_name disable keys
alter table table_name enable keys

优化insert 语句
insert into table_name values (),(),(),...语句可以得到更高的效率
优化group by 语句
关闭group by 的自动排序(升序)
select * from t1 group by name order by null


优化嵌套查询
尽量避免使用子查询 如果使用联结查询能达到同样效果 优先用联结查询
子查询会导致主表可能无法使用索引
例子: select * from t1 where uid in (select id from t2)
     select * from t1 a,t2 b where a.uid=b.id

数据库优化
提高统计查询的速度 :利用视图当作中间表来提高效率


MYSQL服务器优化
1.读锁 lock table t1 read(同时间只有一个人能修改数据,其他用户可以读取数据)
2.写锁 lock table t1 write只有本人能够修改数据(其他用户无法读取或者修改)
3.解锁 unlock tables;
4.四种字符集
  [mysqld]
  Server characterset
  Db characterset
  [client]
  Client characterset
  Conn. characterset
 
  5.bin-log日志
  查看是否开启show variables like "%bin%";
  在/etc/my.cnf 里加入log-bin 的配置

  6.slow-queries-log
  修改my.cnf  
  在[mysqld]下加入
  log_slow_queries = slow.log
  long_query_time = 5 (大于5秒的将写入慢查询日志)

  7.socket
  /tmp/mysql.sock
  登录的时候会用到这个文件

 

 

posted on 2012-08-14 21:36  toxic  阅读(253)  评论(0编辑  收藏  举报