Chinaunix首页 | 论坛 | 博客
  • 博客访问: 107657
  • 博文数量: 21
  • 博客积分: 1657
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-10 16:20
文章分类

全部博文(21)

文章存档

2017年(1)

2014年(3)

2013年(1)

2012年(1)

2011年(9)

2010年(1)

2009年(1)

2008年(3)

2006年(1)

分类: Mysql/postgreSQL

2014-03-10 19:55:30

Mysql设计表及索引的使用

一 设计表规范:

1. 字段需设置为非空,需设置字段默认值。

2. 字段需NULL时,需设置字段默认值,默认值不为NULL

3. 如果字段等价于外键,应在该字段加索引。

4. 不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

5. MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

6. 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

7. 建立索引indexpart1,part2,part3,相当于建立了 index(part1),index(part1,part2)indexpart1,part2,part3)三个索引。

8. MySQL针对like语法必须如下格式才使用索引:

SELECT * FROM t1 WHERE key_col LIKE ab%’ ;

9. SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有

     SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

10. where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

11. where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

12. ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

13. 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

14. JOIN 索引,所有匹配ONwhere的字段应建立合适的索引。

15. 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

16. 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。

17. 定期使用慢日志检查语句,执行explain,分析可能改进的索引。

18. 条件允许的话,设置较大的key_buffer_sizequery_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。

 

二 SQL语句优化规范 :

1. 使用mysql explain sql执行效率进行检测 ,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

  1) 使用方法:在select语句前加上explain即可

  2) explain 分析结果形式如下:

table | type | possible_keys | key | key_len | ref | rows | Extra

    explain 分析结果形式中各属性含义:

    table :显示这一行的数据是关于哪张表的

    type :这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为consteq_regrefrangeindexheALL

    possible_keys :显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

    key :实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEXindexname)来强制使用一个索引或者用IGNORE INDEXindexname)来强制MYSQL忽略索引

    key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

    ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

    rowsMYSQL认为必须检查的用来返回请求数据的行数

    Extra  :返回的描述的意义

2. 尽量使用 "inner join " 查询替换子查询条件中的 "in " ,防止由于数据量过大,引发数据库挂起问题

3.使用索引应注意问题:

1)查询语句的where条件后边使用 “!=”或“<>”时,索引不生效,和普通字段一样

2)查询语句的where条件后边使用字符串函数或其他函数,索引不生效,和普通字段一样

3)使用连接(join)查询时,只有在主键和外键的数据类型相同时索引才会生效

4)查询语句的where条件后边使用Like关键字应注意,like '%jx%' 和 like '%jx'方式索引均不生效, like 'jx%'方式索引生效

5InnoDB数据表不支持全文索引

阅读(3001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~