SQL技巧及优化

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

原文地址:https://www.cnblogs.com/luleiitlife/p/8545078.html