如何建立索引
· 索引通常被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。所以我们选择索引的列也通常选择出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。
· 选择索引时,需要考虑数据列的基数。所谓基数,是指数据列所包含的不同的数据的个数。如果基数相对于数据表行数较高的话,索引的效果比较好。换句话说,就是指数据列的不同的值越多,索引效果越好。如果一个数据列只包含:0或者1两个值的话,索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引。
· 索引值较短的值,所选择的数据类型也尽可能的要小一些。譬如:如果TEXT能满足需求的话,我们就不需要用MEDIUTEXT。
· 如果建立联合索引的话,譬如对:t1,t2,t3建立联合索引的话,同时也是对t1和t1,t2建立了索引。但是如果单独指定t2、t3、t1t3、t2t3的值的话,都会用不到索引。
sql语句中如何避免没有使用索引的情况
首先先了解一下mysql优化器的工作原理:MySQL查询优化器最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。所以当我们提交查询语句时,如果优化器排除不符合条件的数据的速度越快,那么查询的结果也会越快。
·尽量比较数据类型相同的数据列。例如,INT与BIGINT是不同的。CHAR(10)被认为是CHAR(10)或VARCHAR(10),但是与CHAR(12)或VARCHAR(12)不同。
·尽量不要在where子句中对索引列使用表达式或者函数。如果你在索引列使用函数调用或者更复杂的算术表达式,MySQL就不会使用索引,因为它必须计算出每个数据行的表达式值。
WHERE mycol < 4 / 2 使用索引
WHERE mycol * 2 < 4 没有使用索引
WHERE mycol * 2 < 4 没有使用索引
· 在使用LIKE时,尽量不要在开头使用通配符。
WHERE col_name LIKE ’%string%’
WHERE col_name LIKE ’abc%’
· 不要使用类型转换。如果某个索引列是int型,而在查询时,赋值为字符型,将使用不了索引。
SELECT * FROM mytbl WHERE num_col = 1;使用索引
SELECT * FROM mytbl WHERE num_col = ‘1’;没有使用索引
SELECT * FROM mytbl WHERE num_col = ‘1’;没有使用索引
·在SELECT语句中可以使用STRAIGHT_JOIN关键字来重载优化器的选择。
SELECT STRAIGHT_JOIN ... FROM t1, t2, t3 ... ;
SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;
SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;