简单的数据库优化

不管用什么样的语言,数据库是必不可少的,因此数据库优化是必备的。

下面列举几条基本的简单的数据库优化,环境是php + mysql。

1.合理设置字段属性。

大家都知道数据库中的表越小,在它上面执行的查询也就会越快。因此合理设置字段属性,使数据库表尽可能小点,是最简单的数据库优化了。

(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

2.使用连接(JOIN)来代替子查询

往往性能这玩意儿,更多时候体现在数据量比较大的时候,此时,我们应该避免复杂的子查询。如下:

子查询

insert into t1(a1) select b1 from t2 where not exists(select 1 from t1 where t1.id = t2.r_id); 

JOIN

insert into t1(a1)  
select b1 from t2  
left join (select distinct t1.id from t1 ) t1 on t1.id = t2.r_id   
where t1.id is null;  

3,事务 

尽管sql语句越少,执行速度越快,但是有些时候,并不是一跳sql语句可以搞定的。比如说,某商城网站付款完成要先扣余额,然后订单状态成功,但是如果扣完钱了,数据库突然崩溃,订单状态没改,这就会出现很严重的问题。

下面介绍一下thinkphp的事务。

$order = M(‘order’);
$allAdded = true; //先设定一个值为 true;
$data['name'] = 'winter';
$order->startTrans(); //开启事物
for($i = 1;$i<3;$i++){ 
    $sign = $order->add($data); //添加一条数据到order表
    if(!$sign){
        $order->rollback(); //如果order添加失败事物回滚
        $allAdded = false; //并且把allAdded设置为 false
    }
}
//回滚
if($allAdded){
    $order->commit(); 
    // 如果allAdded为真则两条数据都成功;那么 commit事物提交
    echo '添加成功';
}else{
    echo '添加失败';
}

如果commit了。那么就提交插入数据。如果发现alladded为假说明有条数据没插入正确。那么就rollback回滚就会取消事物开启之后操作数据库的所有行为。

4. 合理使用索引

索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。

索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性能,接下来主要介绍在MySql数据库中索引类型,以及如何创建出更加合理且高效的索引技巧。

Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

PRIMARY KEY(主键索引)  ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` ) 

UNIQUE(唯一索引)     ALTER TABLE `table_name` ADD UNIQUE (`col`)

INDEX(普通索引)     ALTER TABLE `table_name` ADD INDEX index_name (`col`)

FULLTEXT(全文索引)      ALTER TABLE `table_name` ADD FULLTEXT ( `col` )
组合索引   ALTER TABLE `table_name` ADD INDEX index_name (`col1`, `col2`, `col3` ) 

5.优化的查询语句

绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。下面是应该注意的几个方面。首先,最好是 在相同类型的字段间进行比较的操作。在MySQL 3.23版之前,这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;但是作为特殊的情况,在CHAR类型的字段和 VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。其次,在建有索引的字段上尽量不要使用函数进行操作。

例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。

1

2

SELECT FROM order WHERE YEAR(OrderDate)<2001;

SELECT FROM order WHERE OrderDate<"2001-01-01";

同样的情形也会发生在对数值型字段进行计算的时候:

1

2

SELECT FROM inventory WHERE Amount/7<24;

SELECT FROM inventory WHERE Amount<24*7;

上面的两个查询也是返回相同的结果,但后面的查询将比前面的一个快很多。第三,在搜索字符型字段时,我们有时会使用 LIKE 关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。

1

2

SELECT FROM books

WHERE name like "MySQL%"

但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:

1

2

SELECT FROM books

WHERE name>="MySQL"and name<"MySQL"

最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。

猜你喜欢

转载自blog.csdn.net/qq_41846563/article/details/81284086