怎么用mysql优化 mysql如何做优化( 五 )


这样处理更快 所需空间更少 而且有时还能简化查询 因为不需要检查是否存在特例 NULL
考虑使用 ENUM 列
如果有一个只含有限数目的特定值的列 那么应该考虑将其转换为 ENUM 列 ENUM 列的值可以更快地处理 因为它们在内部是以数值表示的
有关BLOB和TEXT类型
使用BLOB和TEXT类型的优点
用 BLOB 存储应用程序中包装或未包装的数据 有可能使原来需要几个检索操作才能完成的数据检索得以在单个检索操作中完成 而且还对存储标准表结构不易表示的数据或随时间变化的数据有帮助
使用BLOB和TEXT类型的可能弊端
另一方面 BLOB 值也有自己的固有问题 特别是在进行大量的 DELETE 或 UPDATE 操作时更是如此 删除 BLOB 会在表中留下一个大空白 在以后将需用一个记录或可能是不同大小的多个记录来填充
除非有必要 否则应避免检索较大的 BLOB 或 TEXT 值 例如 除非肯定WHERE 子句能够将结果恰好限制在所想要的行上 否则 SELECT * 查询不是一个好办法 这样做可能会将非常大的 BLOB 值无目的地从网络上拖过来 这是存储在另一列中的 BLOB 标识信息很有用的另一种情形 可以搜索该列以确定想要的行 然后从限定的行中检索 BLOB 值
必要的准则
对容易产生碎片的表使用 OPTIMIZE TABLE
大量进行修改的表 特别是那些含有可变长列的表 容易产生碎片 碎片不好 因为它在存储表的磁盘块中产生不使用的空间 随着时间的增长 必须读取更多的块才能取到有效的行 从而降低了性能 任意具有可变长行的表都存在这个问题 但这个问题对 BLOB 列更为突出 因为它们尺寸的变化非常大 经常使用 OPTIMIZE TABLE 有助于保持性能不下降
使用多列索引
多列索引列有时很有用 一种技术是根据其他列建立一个散列值 并将其存储在一个独立的列中 然后可通过搜索散列值找到行 这只对精确匹配的查询有效 (散列值对具有诸如或 = 这样的操作符的范围搜索没有用处) 在MySQL 版及以上版本中 散列值可利用 MD ( ) 函数产生 散列索引对 BLOB 列特别有用 有一事要注意 在 MySQL 以前的版本中 不能索引 BLOB 类型 甚至是在 或更新的版本中 利用散列值作为标识值来查找 BLOB 值也比搜索 BLOB 列本身更快
将 BLOB 值隔离在一个独立的表中
在某些情况下 将 BLOB 列从表中移出放入另一个副表可能具有一定的意义 条件是移出 BLOB 列后可将表转换为定长行格式 这样会减少主表中的碎片 而且能利用定长行的性能优势
使用ANALYSE过程检查表列
如果使用的是 MySQL 或更新的版本 应该执行 PROCEDURE ANALYSE( ) 查看它所提供的关于表中列的信息
ANALYSE([max elements [max memory]])
它检验来自你的查询的结果并返回结果的分析
max elements(缺省 )是 *** yse将注意的每列不同值的最大数量 这被ANALYSE用来检查最佳的列类型是否应该是ENUM类型
max memory(缺省 )是在 *** yse尝试寻找所有不同值的时候应该分配给每列的最大内存量
SELECT FROM WHERE PROCEDURE ANALYSE([max elements [max memory]])
例如
mysqlSELECT * FROM student PROCEDURE ANALYSE();
mysqlSELECT * FROM student PROCEDURE ANALYSE( );
相应输出中有一列是关于表中每列的最佳列类型的建议 第二个例子要求 PROCEDURE ANALYSE( ) 不要建议含有多于 个值或取多于 字节的 ENUM 类型(可根据需要更改这些值) 如果没有这样的限制 输出可能会很长;ENUM 的定义也会很难阅读
lishixinzhi/Article/program/MySQL/201311/29636
linux 下怎么优化mysql占用内存?修改mysql配置文件,优化缓存大小和连接数连接方式 , 优化sql语句 ,记得mysql好像是有工具可以查看最占用资源的sql语句,找到他,优化他 。

推荐阅读