SQL语句优化
下面的例子:
show status like ‘Com_%’;
其中Com_XXX表示XXX语句所执行的次数。
重点注意:Com_select,Com_insert,Com_update,Com_delete通过这几个参数,可以容易地了解到当前数据库的应用是以插入更新为主还是以查询操作为主,以及各类的SQL大致的执行比例是多少。
Connections:试图连接MySQL服务器的次数
Uptime:服务器工作的时间(单位秒)
Slow_queries:慢查询的次数 (默认是慢查询时间10s)
log-slow-queries="G:/amp/MySQL/log/long-query.log"
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]
查看超时时间show variables like ‘long_query_time’;默认为10秒 太多了
设置超时时间set long_query_time=2;设置为2秒
查看慢查询日志:找到my.ini设置的日志文件即可
如果启动时设置:默认为数据目录data中的host-name-slow.log。低版本的mysql需要通过在开启mysql时使用- -log-slow-queries[=file_name]来配置
会产生如下信息:
select_type:表示查询的类型。
table:输出结果集的表
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
rows:扫描出的行数(估算的行数)
Extra:执行情况的描述和说明
默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序
因为使用join,MySQL不需要在内存中创建临时表
对mysql优化时一个综合性的技术,主要包括
a: 表的设计合理化(符合3NF)
b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引
没有索引时 会遍历整个表数据 全部检索完毕返回结果集
添加索引:二叉树算法->索引 能够快速定位
BTREE
索引是以文件形式存储的,记录记录的磁盘位置,
若数据库迁移 要重新生成索引
使用索引时注意:
1,对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
2,对于使用like的查询,左匹配,最左边的不能是变化的,
如果like ‘%name‘ 不会使用索引
如果like ‘_name‘ 不会使用索引
如果 like ‘name%‘ 会使用索引
如果一定要前面有变化值 则考虑使用全文索引 spihnx
1,如果条件中有or ,所有的条件都要建索引 才会使用索引 建议尽量避免使or。
2,对于多列索引,不是使用的第一部分,则不会使用索引。
3,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’)
4,如果mysql估计使用全表扫描要比使用索引快,则不使用索引。
show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
哪些列需要创建索引
c: 分表技术(水平分割、垂直分割)
水平分割:
d: 读写[写: update/delete/add]分离
如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散。
Master
Slave1
Slave2
Slave3
主库master用来写入,slave1—slave3都用来做select,每个数据库分担的压力小了很多。
要实现这种方式,需要程序特别设计,写都操作master,读都操作slave,给程序开发带来了额外负担。当然目前已经有中间件来实现这个代理,对程 序来读写哪些数据库是透明的。官方有个mysql-proxy,但是还是alpha版本的。新浪有个amobe for mysql,也可达到这个目的,结构如下:
e: 存储过程 [模块化编程,可以提高速度]
php操作dbms(编译->执行->缓存),而存储过程是编译好的二进制文件形式,省去了编译这一过程,所以会快些。
f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
innodb_additional_mem_pool_size = 64M
innodb_buffer_pool_size =1G
当然调整参数还是要看状态,用show status语句可以看到当前状态,以决定改调整哪些参数
g: mysql服务器硬件升级
h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)
使用mysql的MyISAM引擎时,删除的数据,存储在磁盘中的文件并不会减小,要定期进行碎片整理操作。
optimize table 表名 即可