SQL优化--OR、IN、NULL
or,两边条件都有索引可用
一但有一边无索引可用就会导致整个SQL语句的全表扫描
使用in代替or
MySql中,IN()先将自己列表中的数据进行排序,然后通过二分查找的方式确定列的值是否在IN()的列表中,时间复杂度是O(logn)。如果换成OR操作,则时间复杂度是O(n)。对于IN()的列表中有大量取值的时候,用IN()替换OR操作将会更快。
NOT IN强烈不推荐使用,用NOT EXISTS 代替
尽量使用NOT NULL
在MySQL中,NULL值并非我们一般意义上的空值。他是占用空间的,可以通过下面的查询了解:
SELECT LENGTH(''), LENGTH(' '), LENGTH(NULL); +------------+-------------+--------------+ | LENGTH('') | LENGTH(' ') | LENGTH(NULL) | +------------+-------------+--------------+ | 0 | 1 | NULL | +------------+-------------+--------------+ 1 row in set (0.00 sec)
虽然NULL占用了空间,可是MySQL却并不为NULL字段创建索引。
is null,is not null无法使用索引
不要以字符串定义IP地址
ip VARCHAR(15) NOT NULL
如果你了解IP地址是可以进行整型转换的话,那么这样的设计显然有点逊色了。我们可以将这个字段定义成UNSIGNED INT或是LONG。将IP定义成整型的好处在于,方便地对其创建索引,还可以方便地进行范围查询:
... WHERE ip BETWEEN ip1 AND ip2
立志如山 静心求实
浙公网安备 33010602011771号