设计合理的数据表结构

1:选择合适的数据类型,如果能定长,尽量定长
2:不要使用无法加索引的类型为关键字段,比如text类型
3:为了避免联表查询,有时候可以适当的数据冗余,比如邮箱,名字这些不容易更改的数据
4:选择合适的表引擎,有时候MyISANM适合,有时候InnoDB适合,
5:为了保证查询性能,最好保证每个表建立auto_increatment字段,建立合适的数据库索引
6:最好给每个字段都设置default值

索引建立原则

1:一般针对数据分散的关键字进行建立索引,比如ID,QQ,像性别,状态值建立索引没有意义。
2:尽量使用短索引,一般对int,char/varchar.date/time等类型的字段建立索引
3:需要的时候建立联合索引,但是要注意查询SQL语句的编写
4:一般建议每条记录最好有一个能够快速定位独一无二定位的唯一标识(索引)、
5:不要过度索引,单表建立的索引不要超过5个,负责更新索引很耗时

编写高效的SQL

1:能够快速缩小结果集的where条件写在前面,如果有恒量条件也尽量放在前面。
2:尽量避免group by,distinct,in,or等语句的使用,避免使用联表查询和子查询,因为将使执行效率大大下降。
3:能够使用索引的字段尽量进行合理的有效排列,如果使用了联合索引,请注意提取字段的前后顺序。
4:针对索引字段使用,大小等的比较,if null 和between 将会使用索引,使用like 'abc%'将能够使用索引,
5:如果在SQL中使用了MySQL的部分自带函数,索引将失效,同时将无法使用MYSQL的query Cache,比如letf(),SUBSTR().TO_DAYS(),DATE_FORMAT()等,如果使用了OR或者In,索引也将失效。

常用技巧分享

1:使用 SHOW PROCESSLIST来查看当前MYSQL服务器线程的执行情况,是否锁表,查看相应的SQL语句。
2:设置 my.ini中的long-query-time和log-slow-queries能够记录服务器中那些SQL执行较慢,
3:使用DESC TABLE xxx来查看表结构,使用SHOW INDEX FROM xxx来查看表索引。
4:使用LAOD DATA倒入数据比INSERT INTO快多了。
5:SELECT count() From Tbl在你InnoDb中要扫描整个表来计算有多少行,但是MyISAM只要简单的读取保存好的行数即可,注意的是,当count()语句包含where条件时,两种表的操作是一样的。

Select查询速度

要想是一个较慢的select where更快,应首先检查是否能够增加一个索引,你可以使用explain语句来确定select语句使用那些索引。
为了帮助MySQL更好的优化查询,在一个装载数据后的表上运行 ANALYZE TABLE或myisamchk –analyze。这样为每一个索引更新指出有相同值得行的平均行数的值,(当然,如果只有一个索引,这总是1),Mysql采用这种方式来决定当你连接两个基于非常量表达式的表时,该采用哪个索引,你可以使用SHOW INDEX FROM tbl_name并检查cardinality值来检查表,分析结果

08-24 17:44