mysql优化

来源:互联网 发布:seo标题是什么意思 编辑:程序博客网 时间:2024/06/06 04:13

一、mysql数据库设计,字段类型设置不好会给数据库增加了不必要的空间,字段类型介绍如下:
1、bigint

从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到

18446744073709551615。一位为 8 个字节。取值范围:-9223372036854775808 - 9223372036854775807 

2、int

一个正常大小整数。有符号的范围是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字),无符号的范围是0到4294967295。一位大小为4 个字节。取值范围:-2147483648 - 2147483647 
int 的 SQL-92 同义词为 integer
3、mediumint
一个中等大小整数,有符号的范围是-8388608到8388607,无符号的范围是0到16777215。 一位大小为3个字节。取值范围:-8388608 - 8388607 

4、smallint

一个小整数。有符号的范围是-2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据,无符号的范围是0到65535。一位大小为 2 个字节。MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。取值范围:-32768 - 32767 

5、tinyint

有符号的范围是-128 - 127,无符号的范围是 从 0 到 255 的整型数据。一位大小为1 字节。取值范围:-128 - 127 

例如:

    在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的。因为只要采用CHAR(6)就可以做到。

二、使用连接(JOIN)来代替子查询(Sub-Queries) --->( 不需要在内存中创建临时表)

    (1)left join 

    (2)right join

    (3)inner join

    (4)full join

例如:

    情景:一个订单中有个分多个订单详情(订单拆分),一个人帮多个下订单

    select count(id) from ordersInfo where orderId =(select orderId from orderInfo where id ='372');

   等价select count(t.id) from ordersInfo inner join orderInfo a on a.orderId = t.orderId where a.id ='372';

三、3、使用联合(UNION)来代替手动创建的临时表 

四、采用事物----->保持数据库中数据的一致性和完整性

 例如:

BEGIN; 
INSERT INTO user  SET userName='davis'; 
UPDATE orders SET status='待评价' where id='345'; 
COMMIT; 

(1)事务的另一个重要作用是当多个用户同时使用相同数据库时,可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰

(2)但是事物也有个缺点,事物具有独占性,这样有时就会影响数据库的性能,特别是一些比较大的应用系统,因为这样可能会产生非常严重的延迟效果。

五、合理采用外键

六、使用索引---->(相同类型的字段间进行比较的操作)

     索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。

   注:索引应建立在那些将用于JOIN, WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引

七、优化查询sql

 (1) 利用LIMIT 1取得唯一行,有效防止全表扫

 (2) 不要使用BY RAND()命令

 (3) 尽量避免SELECT *命令--->从表中读取越多的数据,查询会变得更慢。他增加了磁盘需要操作的时间

 (4)in 和 not in 也要慎用,否则会导致全表扫描

 (5) 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

 (6)  应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

 (7)  应尽量避免在 where 子句中使用!=或$amp;

 (8)  模糊查询将导致全表扫描: select id from user where userName like '%davis%';若要提高效率,可以考虑全文检索。

 (9)   如果在 where 子句中使用参数,也会导致全表扫描 例如:select userName from user where id =@userId;

          可以改为强制查询使用索引: selectuserName  from user with(index(索引名)) where id=@userId;

 (10) 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

 (11) 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描

 (12) 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间

 (13) 避免频繁创建和删除临时表,以减少系统表资源的消耗

1 0
原创粉丝点击