1、字段空间能小则小,索引不该建立在大字段上;
2、索引字段设置not null 给默认值;
3、使用ENUM、TINYINT类型比文本类型效率高;
4、选择离散程度大的字段建立索引;
5、索引应建立在那些将用于JOIN、WHERE条件判断、ORDERBY排序的字段上;
6、在大量数据转移(插入到新表)时,将数据先转移到一个没有索引(除了主键)的表上,再建立其它索引,这样比,直接转移到一个已经创建好索引的表上,前者效率要高很多;
7、数据插入采用批量操作;如 INSERT INTO t (id, name) VALUES(1,’Bea’), (2,’Belle’),(3,’Bernice’);不要一条一条插入;
8、in条件中的子查询集用关联查询后where条件判断代替;
如SELECT * FROM customerinfo WHERE CustomerID NOT IN(SELECT CustomerID FROM salesinfo);
用SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID WHERE salesinfo.CustomerID IS NULL;
9、字段子查询,如果子查询目标表的数据比较少,可以使用;
10、减少独占的范围;
如事务操作
BEGIN;INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book';COMMIT; 这样的独占范围就太大了(数据库级别)
用如下代替
LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item='book'; // 只锁住需要同步修改操作对应的位置
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11 WHERE Item='book';UNLOCK TABLES;
如上即保证了insert 操作、update操作的同步,也尽力的减少了因为同步需要独占表的范围;
11、最好是在相同类型的字段间进行比较的操作;
12、在建有索引的字段上尽量不要使用函数进行操作;
13、在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的;
例如:下面的查询将会比较表中的每一条记录。
SELECT* FROM books
WHERE name like"MySQL%";
但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:
SELECT* FROM books
WHERE name>="MySQL"and name<"MySQM";
14、应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用;
15、ORDER BY NULL禁止排序
SELECT goods_id,count(*) FROM t GROUP BY goods_id;
默认情况下,MySQL对所有GROUP BY col1,col2…的字段进行排序。
如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序;
待续....