您的位置:首页 > 数据库 > MySQL

读 高性能MySQL

2010-11-08 08:54 239 查看
1.解决MYSQL和和进程故障

show processlist/G
查看 host 项

查找具体进程的 ID
netstat -ntp | grep :34334

netstat -ntp | grep 123423/apache

查找进程更新过的文件:
lsof -i -P | grep 12343
2.数据类型常识
有符号(Signed) 和 无符号(Unsigned) 占据存储空间都是一样的。性能也。。
不要用 NULL
对整数类型定义宽度, INT(11) 是没有意义的。它不会限制值的范围,只是规定MYSQL 交互工具(例如命令行客户端)用来显示字符的个数。
varchar 使用额外的1到2字节来存储值的长度。如果列的最大长度小于或等于255,则使用1字节。
5.0以上版本,MYSQL都会保留VARCHAR 字符窜末尾的空格。
容易产生碎片
char 存储单字节字符集只会占用1个字节。 不容易产生碎片。
enum 在内部把每个值都保存为整数。 在内部是按照数字顺序进行排序,而不是按照字符窜排序。 enum 最不好的一面是字符窜列表是固定的。并且添加或者删除字符窜都需使用ALTER TABLE。 在特定情况下,把CHAR 或 VARCHAR 列 和 ENUM 列进行联结,可能会联结另一个CHAR 或 VARCHAR 列慢。
一旦选择了数据类型,要确保在相关表中使用同样的类型。类型之间要精确匹配,包括诸如 UNSIGNED 这样的属性。
索引:
隔离列: 如果在查询中没有隔离索引的列,MYSQL 通常不会使用索引。 “隔离”列意味着它不是表达式的一部分,也没有位于函数中。
聚集索引: 聚集索引把索引和数据都保存到了同一棵B-TREE中。只有innodb支持。 最好避免随机(乱序)聚集键。
覆盖索引: 不能 全选 SELECT * FROM 列。 不能执行 like 左右匹配。
排序使用索引扫描: 1.查询联结多个表,只有在order by 子句的所有列引用的是第一个表的才可以。 2。只有当索引的顺序和ORDER BY 子句中的顺序完全一致。并且所有列排序的方向爱那个一样才可以。3. 使用索引的最左前缀。 OEDER BY 无须定义索引的最左前缀的一种情况是前导列为常量。
低层次的存储引擎操作是“从索引的开头开始,并且提取所有行直到 actor_id < 5 不成立。 注意到解释器的Extra列中出现了“使用Where(Using Where) 意味着MYSQL 在存储引擎返回行之后使用了WHERE 过滤条件。
Innodb 如果没有索引,Mysql 不管是否需要行,都会进行全表扫描并且锁定每一行。
共享锁 == 读取锁 独占锁 == 写入锁
范围条件(WHERE actor_id > 54) 使mysql忽略了索引中的其他列。 但是多个相等条件(actor_id IN (1,3,4))就不会有这个局限。
check table 测试表是否损坏
repair table 修复损坏的表
analyze table 更新表行的数量。有助于精确使用缩影。 myisam 会锁表。 innodb 不锁表,可以在线更新。
optimize table 消除 “行碎片” “内部行碎片”
mysql中 最简单的开销指标有三个: 执行时间 检查的行数 返回的行数
MYSQL 会在 3种情况下使用WHERE子句,从最好到最坏依次是:
1.对索引查找应用WHERE 子句来消除不匹配的行,这发生在存储引擎层。
2.使用覆盖索引。这个发生在服务器层
3.从表中搜索出数据,然后过滤掉不匹配的行 (Extra Using Where)
如果order by 子句只引用了联结中的第一个表,MYSQL会先对该表进行排序,然后处理联结。Extra 显示“ 使用了文件排序(Using filesort)” 否则, mysql 必须把结果保存在临时表,然后对临时表进行排序。 Extra 显示“Using temporary,Using filesort)
如果想知道结果的行数,应该总是使用 COUNT(*) 这样可以得到好的性能
优化连接: 确保 ON 或者 USING 使用列上有索引。 添加索引要考虑联结的顺序。 比如 联结表 A和B 时候。 如果优化器是按照从B到A顺序连接,就不需要在表B上添加索引了。 通常说只需要在联结的第二个表添加索引。确保GROUP BY 或 ORDER BY 只引用一个表的列。这样MYSQL尝试对这些操作使用索引。
query缓存:
Query_cache_type : 表示缓存是否被激活。 256M已经太大了。
Query_cache_size : 分配给查询的总内存,已字节为单位。它必须是1024的倍数。想关闭查询缓存,就把这个设置为 0
Query_cache_min_res_unit: 分配缓存块的最小值。
Query_cache_limit : 限制了MYSQL 存储的最大结果。如果查询结果比这个值大,那么就不会缓存。
query_cache_min_res_unit 可以避免在查询缓存中造成大量的内存浪费。 如果值过小,服务器就会浪费较少的内存,但会更频繁的分配块,如果值过大,碎片就会很多。
Qcache_free_blocks 探测缓存中的碎片情况,它可以显示缓存中有多少内存块处于free状态。如果Qcache_free_blocks 大致等于 Qcache_total_blocks/2 则说明碎片非常严重。 FLUSH QUERY CACHE 命令移除缓存。
如果缓存中没有碎片,但是命中率不高,那么就应该给缓存分配较少的内存。
Qcache_free_memory 知道未使用的内存数量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: