欢迎使用CSDN-markdown编辑器

来源:互联网 发布:程序员编程艺术 pdf 编辑:程序博客网 时间:2024/05/22 11:46

(一) 数据库存储引擎的选择;

常用的有MyISAMInnoDB(mysql默认引擎)

  1. 当数据并发不大,读多写少,且不需要事物时,需要全文索引,选择MyISAM
  2. 当数据并发大,写(修改添加)多,且需要事物时,选择InnoDB

(二) 表命名规则

  1. java开发语言命名规则:MyAddress
  2. java开源思想命名规则(加前缀):my_address

(三) 字段规则

1:在满足需求的情况下字段类型尽可能小

    Eg: smallint可以满足就别用int,类型越大,占用的存储空间、磁盘空间、宽带越大。

2:只分配满足需求的最小字符数,不要太慷慨.

Eg: Integer(5)可以满足需求就别写Integer(10)

3:数据类型该”胖”的地方不可以”瘦”

    Eg:拿varchar字段 讲,如果没有要边长的列,最好使用固定长度,往往会浪费一定的存储空间,  (比如varchar(255), 你某一列长度不够255,但存储的长度还是255),但是在这种情况下,能够用固定长度的,还是要使用固定长度。因为这种情况下虽然会浪费一定的硬盘空间,但是却可以提高数据的查询速度。

4:将一个经常被扫描的大表分割为2个或者2个以上的表当然这个效果的好坏,直接跟这个拆分的规则有关。

5:在适合的地方和时机建立索引

  1. 索引的优点:极大地加速了查询,减少扫描和锁定的数据行数。
  2. 索引的缺点:占用磁盘空间,减慢了数据更新速度,增加了磁盘IO。

6:字段尽量都设置为NOT NULL;除非有特殊需求。

  1. 使用含有NULL列做索引的话会占用更多的磁盘空间

  2. 进行比较的时候,程序会更复杂。

  3. 含有NULL的列比较特殊,SQL难优化,如果是一个多列索引,那么这个NULL 类型的字段会极大影响整个索引的效率.

7:sql语句优化

  1. 尽量不要在数据库中做运算。
  2. 不要在生产环境程序中使用select * from 的形式查询数据。只查询需要使用的列。
  3. 查询尽可能使用limit减少返回的行数,减少数据传输时间和带宽浪费
  4. 避免隐式类型转换,例如字符型一定要用’’,数字型一定不要使用’’。
  5. 所有的SQL关键词用大写,养成良好的习惯,避免SQL语句重复编译造成系统资源的浪费。
  6. 联表查询的时候,记得把小结果集放在前面,遵循小结果集驱动大结果集的原则。
  7. 不在索引列做运算或者使用函数。

8:mysql配置优化(自行百度)

9:Mysql软件优化
搭建分布式集群等。

补充:
为什么使用索引会加快查询的速度?:
索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
举个例子:
表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍!

mysql索引的创建与使用:
索引类型:1:普通索引、2:唯一索引、3:主键、4:全文索引(MySQL 3.23.23版本以后)、5:多列索引

1:(Normal) 基本索引,没有唯一性的限制
语法:
Create index 索引名称 on 表名 (列名); 列名必须加括
Alter 表名 add index索引名称 (列名);
Create table 表名(id int, username varchar(255), index 索引名称 (列名));

2: (Unique)唯一索引列的所有值都只能出现一次,即必须唯一,但可以为null
语法:
Create unique index 索引名称 on 表名 (列名);
Alter 表名 add unique索引名称 (列名);
Create table 表名(id int, username varchar(255), unique 索引名称 (列名));

3: (Primary Key)主键可以说是唯一索引的特殊类型,但它必须指定为“PRIMARY KEY”,且不可为null.
可以设置AUTO_INCREMENT
语法:
Alter 表名 add primary key (列名);
Create table 表名(id int, username varchar(255), primary key (列名));

4:(Full Text)全文索引可以建立在 char, varchar, text 类型的字段上,但存储引擎必须是MyIsam的,InnoDB目前不支持
语法:
Alter 表名 add FULLTEXT (列名);
Create table 表名(username varchar(255), FULLTEXT (username));
用法:
Select * from 表名 where match(列名) against(‘你要查找的文本’);不区分大小写

5:多列索引
比如你要执行一个sql:select * from user where dept = ‘主管部’ and age = 20 and sex = ‘男’
我们肯定不想 每次执行这个sql时就让mysql去扫描整个表. 所以此时就用到了索引。
我们可以给dept字段[或者age 字段或者sex 字段 加索引(单列索引)],mysql会快速把搜索范围先知道 dept = ‘主管部’的记录,然后在这个记录上扫描另外两个字段,效果比不加索引块很多,有没有更快的呢?这是就用到了 多列索引:
Alter table user add index 索引名称 (dept, age, sex);
MySQL能够立即转到合适的dept,然后再转到合适的age,最后转到合适的sex。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录.

那么有人问了:我在这三个字段上都加上索引不就可以了吗。答案是否定的,如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于dept、age、sex这三个列上的多列索引。

6:(对5的补充)最左前缀:当搜索条件是以下各种列的组合时,MySQL将使用这个多列索引:
dept、age、sex 或者 dept、age 或者dept/age/sex。

0 0
原创粉丝点击