`
myfreespace
  • 浏览: 223262 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

myql优化全方位

阅读更多

     为什么要优化数据库,提高访问速度,防止出现死锁,这是我们经常想到的,那数据库为什么会产生这些问题啊,我们先来看看数据库产生访问速度的瓶颈在哪里,机器物理上的磁盘搜索 磁盘读写 和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

·         索引使用的常数表达式仅计算一次。

  • 对于MyISAMHEAP表,在一个单个表上的没有一个WHERECOUNT(*)直接从表中检索信息。当仅使用一个表时,对NOT NULL表达式也这样做。
  • 无效常数表达式的早期检测。MySQL快速检测某些SELECT语句是不可能的并且不返回行。
  • 如果不使用GROUP BY或分组函数(COUNT()MIN()……)HAVINGWHERE合并。
  • 对于联接内的每个表,构造一个更简单的WHERE以便更快地对表进行WHERE计算并且也尽快跳过记录。
  • 所有常数的表在查询中比其它表先读出。常数表为:
    • 空表或只有1行的表。
    • 与在一个PRIMARY KEYUNIQUE索引的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容易发生死锁,两个事物都需要对方的排他锁才能完成事务,双方都等待状态,
数据库 和 数据结构的优化


 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics