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

  

  

  

posted on 2021-08-28 18:03  溪水静幽  阅读(1334)  评论(0)    收藏  举报