您的位置:首页 > 数据库

SQL技巧及优化

2015-11-28 21:34 253 查看
rand()函数:生成0到1之间的随机数,

使用rand()和order by 可以把表中的记录随机排序

例如:select * from t1 order by rand()

group by 结合with rollup

show status 查询sql执行频率:

show status like ‘com_insert%’ 查询插入的次数

show status like ‘com_select%’

show status like ‘com_update%’

show status like ‘com_delete%’

针对innodb引擎的:

show status like ‘innodb_rows%’;

+———————-+———-+

| Variable_name | Value |

+———————-+———-+

| Innodb_rows_deleted | 1 |

| Innodb_rows_inserted | 6518 |

| Innodb_rows_read | 58519129 |

| Innodb_rows_updated | 4 |

+———————-+———-+

4 rows in set (0.00 sec)

慢查询次数:

show status like ‘%slow_queries%’;

优化 :

1通过慢查询日志找到执行效率低的SQL语句

2 explain select * from tousu \G

id: 1

select_type: SIMPLE

table: tousu

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 5

Extra:

1 row in set (0.00 sec)

select_type:

SIMPLE :简单表,即不使用表连接和子查询

PRIMARY :主查询

UNION :

SUBQUERY:子查询

type:ALL 通过全表扫描得到的数据

range 范围扫描

index_merge 索引合并优化

eq_ref 使用主键和唯一

possible_keys :表查询可能使用的索引

key :实际使用的索引

key_len :索引字段的长度

总结:通过慢查询定位到SQL,然后explain看此SQL是否使用到索引

索引:通过索引可以解决大多数的性能问题

myISAM 引擎表的数据和索引分开存储,各自独立的文件,

innodb 引擎表数据和索引存储在同一个表空间中,可以有多个文件组成

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

如果对大的文本搜索,使用全文索引而不使用’%%’

查询group by 后面,默认分组升序排列,可以再加上order by null,避免排序的性能损耗。

避免使用子查询和嵌套查询,此种查询不会使用索引,,改为左右连接查询

mysql 读写锁:

读锁:锁定后,别人也可以读,但不能写

写锁:只有自己可以操作,别人什么操作都不能做。

mysql四种字符集:

db

server

conn

client

如何设置字符集:my.conf中修改

查看慢查询日志是否开启:

show variables like ‘%slow%’;

慢查询时间

show variables like ‘%long%’;

开启慢查询日志:

linux 下

vi /etc/my.conf

log_slow_queries=slow.log

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