优化mysql数据库的几个步骤

优化mysql数据库的几个步骤,第1张

1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM

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

a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid

WHERE orderinfo.customerid IS NULL

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

a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

4、事务处理:

a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败

mysql_query("BEGIN")

mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')"

mysql_query("SELECT * FROM `orderinfo` where customerid=".$id")

mysql_query("COMMIT")

5、锁定表,优化事务处理:

a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。

包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,

不会有其它的访问来对 inventory 进行插入、更新或者删除的 *** 作

mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE")

mysql_query("SELECT customerid FROM `customerinfo` where id=".$id)

mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id)

mysql_query("UNLOCK TABLES")

6、使用外键,优化锁定表

a.把customerinfo里的customerid映射到orderinfo里的customerid,

任何一条没有合法的customerid的记录不会写到orderinfo里

CREATE TABLE customerinfo

(

customerid INT NOT NULL,

PRIMARY KEY(customerid)

)TYPE = INNODB

CREATE TABLE orderinfo

(

orderid INT NOT NULL,

customerid INT NOT NULL,

PRIMARY KEY(customerid,orderid),

FOREIGN KEY (customerid) REFERENCES customerinfo

(customerid) ON DELETE CASCADE

)TYPE = INNODB

注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order

表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB

7、建立索引:

a.格式:

(普通索引)->

创建:CREATE INDEX <索引名>ON tablename (索引字段)

修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)

创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))

(唯一索引)->

创建:CREATE UNIQUE <索引名>ON tablename (索引字段)

修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)

创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))

(主键)->

它是唯一索引,一般在创建表是建立,格式为:

CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])

8、优化查询语句

a.最好在相同字段进行比较 *** 作,在建立好的索引字段上尽量减少函数 *** 作

例子1:

SELECT * FROM order WHERE YEAR(orderDate)<2008(慢)

SELECT * FROM order WHERE orderDate<"2008-01-01"(快)

例子2:

SELECT * FROM order WHERE addtime/7<24(慢)

SELECT * FROM order WHERE addtime<24*7(快)

例子3:

SELECT * FROM order WHERE title like "%good%"

SELECT * FROM order WHERE title>="good" and name<"good"

1.硬件层次的优化

高频CPU,内存要大,磁盘转速要快,网络带宽要大。要硬件方面优化,花钱升级硬件吧。

2.软件层次的优化

我大概写一些吧,想到哪些写哪些,希望对你有用。

(1)优化安装mysql

一句话,只保留需要的、必须的,其他的统统丢掉。(这句话只适用于源码编译安装的情况,如果不是,请跳过)比如,字符集。如果安装全部字符集,大概有50多种吧...记不清了,大概有这么多,但是过多的字符集影响性能(虽然影响的不多,mysql查询机制中有一步是字符集检查)。源码编译安装的话可以大量减少字符集,只保留必须的和自己需要的那些。我维护的一个mysql服务器中的Mysql只有15个字符集。

还有就是配置文件、数据目录、系统目录不要放一块。俗话说的好,鸡蛋不要放在一个篮子里,不要在一颗树上吊死...当然,这对性能没有影响,考虑的是安全性。不是生产环境的,请无视这一条。

(2)内存分配优化。

在mysql中的配置文件中可以自定义多种缓存,适当的配给值可以提高mysql的整体性能。

比较重要的:

innodb_buffer_pool_size 这个值应该分配总内存的40-80%,总之 这个值越高越好。如果不是专属mysql服务器,那分配40%也很够用了。

query_cache_size 这个值分配灵活性也比较大,从几MB~几百MB。它缓存查询的结果集。查询不是能频繁、查询数据不是很大量的情况,分配个几MB就够了,杀鸡焉用牛刀啊,用内存的地方实在是多。

join_buffer_size,sort_buffer_size 一般设1MB,2MB就十分够用了。这俩值千万不要设置的太大,因为这俩缓存是分配给每个连接线程的,过多的连接线程可能导致内存不够用。

tmp_table_size 同样不是越大越好,分配10MB差不多够用。以后有需要可以适当多分配点。临时表缓存用于存放查询时产生的临时表,如果数据量大而tmp_table_size不够用那么Mysql会将临时表存到磁盘上导致性能下降。个人经验,当你觉得tmp_table_size不够用的时候,不要随便去增加这个值,而是检查自己的SQL语句是否还可以优化。

(3)复制与读写分离

内容太多...这个不好写啊。总之读写分离的目标是,安全、稳定、高效。访问量少、只有一台电脑的请无视这一段...

mysql的优化知识全部写出来能写出一本砖头厚的书,随便写了点自己知道的,能想到的。想了解更多,去看书吧。

我勒个去.....才看到题目后面的(sql)....吐一大口鲜血....你问的是sql优化???

再写点个人经验吧:

1.查询时,能不用* 就不用,尽量写全字段名。

2.索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100

3.大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么...

4.多用explain 和 profile分析查询语句

5.有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。

6.每隔一段时间用alter table table_name engine=innodb优化表

7.连接时注意:小表 jion 大表的原则

8.学会用explain 和 profile判断是什么原因使你的SQL慢。

9.查看慢查询日志,找出执行时间长的SQL试着优化去吧~~

以上。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7370354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存