为什么要优化数据库,提高访问速度,防止出现死锁,这是我们经常想到的,那数据库为什么会产生这些问题啊,我们先来看看数据库产生访问速度的瓶颈在哪里,机器物理上的磁盘搜索 磁盘读写 和cpu的周期,而软件上数据库为了读写的协调性采用了锁机制,不同的引擎有不同的锁机制,主要看myisam innodb 的锁机制,myisam是表级锁,都共享 写独占的串行操作,所以select insert为主的行为用这种引擎好,myisam锁的调度是写进程先获得锁,不仅如此即使读请求先到锁等待队列,写请求后到,写锁也会查到读请求之前,这是因为 引擎认为写请求比读请求重要,因大量的update操作会造成查询操作很难获得读锁,从而可能永远阻塞,但可以通过调节一些调度行为。
首先一个因素是你的许可设置的越复杂开销就越大,所以在grant语句的时候尽量简单许可,如果是函数的问题可以在客户端通过SELECT BENCHMARK(1000000,1+1);benchmark(num,fn)表示函数fn执行num次 可以用来查看函数的执行效率,
可以使用explain语法来分析 获取select的相关信息explain talbename /explain select * 将显示表如何连接和联接的次序,更重要的是可以用来发现什么时候为表建立一个索引,analyaze table分析表,】
select 优化 ,可以通过explain来分析此select 语句使用了那些索引,
去除不必要的括号:
· ((a AND b) AND c OR (((a AND b) AND (c AND d))))
· -> (a AND b AND c) OR (a AND b AND c AND d)
· 常量重叠:
· (a<b AND b=c) AND a=5
· -> b>5 AND b=c AND a=5
· 去除常量条件(由于常量重叠需要):
· (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
· -> B=5 OR B=6
· 索引使用的常数表达式仅计算一次。
- 对于MyISAM和HEAP表,在一个单个表上的没有一个WHERE的COUNT(*)直接从表中检索信息。当仅使用一个表时,对NOT NULL表达式也这样做。
- 无效常数表达式的早期检测。MySQL快速检测某些SELECT语句是不可能的并且不返回行。
- 如果不使用GROUP BY或分组函数(COUNT()、MIN()……),HAVING与WHERE合并。
- 对于联接内的每个表,构造一个更简单的WHERE以便更快地对表进行WHERE计算并且也尽快跳过记录。
- 所有常数的表在查询中比其它表先读出。常数表为:
- 空表或只有1行的表。
- 与在一个PRIMARY KEY或UNIQUE索引的WHERE子句一起使用的表,这里所有的索引部分使用常数表达式并且索引部分被定义为NOT NULL。
下列查询使用索引按排序顺序检索行,不用另外的排序:
SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... ;
SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ... ;
当某一列使用过索引后,默认就按索引进行排序了,以后在使用该列排序的时候就不用排列了,直接可以使用,
Innodb的行级别锁,支持事务;事务的caid 为原子性atomicity 一致性consitien 隔离性isolocation 持久性durable
innodb容易发生死锁,两个事物都需要对方的排他锁才能完成事务,双方都等待状态,
数据库 和 数据结构的优化