1.mysql优化器采用范围扫描优于索引合并扫描:
EXPLAIN EXTENDED SELECT *
FROM `test`
WHERE (
AND `p` <300
FROM `test`
WHERE (
id <400
OR tid <300
)OR tid <300
AND `p` <300
如果id和tid、p都有单独索引,则使用的是索引p,而不是id和tid的合并索引
2.删除一个表的所有行,使用TRUNCATE TABLE tbl_name 而不要用DELETE FROM tbl_name
3.对于没有删除的行的MyISAM表,可以在另一个查询正从表中读取的同时在末尾插入行。
4.当不需要知道何时写入数据时,使用INSERT DELAYED。这样可以加快处理,因为很多记录可以通过一次磁盘写入被写入;当你想要让选择显得更重要时,使用INSERT /*! LOW_PRIORITY */。
5.MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。
6.InnoDB使用行锁定,BDB使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。
行级锁定的优点:
(1)当在许多线程中访问不同的行时只存在少量锁定冲突。
(2) 回滚时只有少量的更改。
(3)可以长时间锁定单一的行。
行级锁定的缺点:
(1)比页级或表级锁定占用更多的内存。
(2)当在表的大部分中使用时比页级或表级锁定速度慢,因为你必须获取更多的锁。
(3)如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
(4) 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
在以下情况下,表锁定优先于页级或行级锁定:
(1)表的大部分语句用于读取。
(2) 对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
(3)SELECT 结合并行的INSERT语句,并且只有很少的UPDATE或DELETE语句。
(4)在整个表上有许多扫描或GROUP BY操作,没有任何写操作。
7.字段为NOT NULL则任何事情更快而且每列可以节省一位;
默认情况MEMORY(HEAP)存储引擎使用hash索引,但也支持B-树索引。
8.前缀索引兼顾索引大小和查询速度,但是其缺点是不能用于ORDER BY和GROUP BY操作,也不能用于Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)。
转载于:https://blog.51cto.com/hjun169/934295