首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
m4ker
V2EX  ›  MySQL

关于null的索引不生效的传说是真的么?

  •  
  •   m4ker · 2013-02-16 11:31:47 +08:00 · 14756 次点击
    这是一个创建于 2604 天前的主题,其中的信息可能已经有所发展或是发生改变。
    官方手册没有找到相关说明。我们这边用千万级的表进行了一系列测试,测试到目前为止还没有有利的数据能证明这个传言是真实的,插入null值索引也有增加,查询null值索引也的确生效了,单列和组合都试过了,是否有同学了解内情?这个传言是否和oracle有关?
    5 条回复    1970-01-01 08:00:00 +08:00
    napoleonu
        1
    napoleonu   2013-02-16 11:58:30 +08:00   ❤️ 1
    没听说过这个说法,给个来源?
    shiny
        2
    shiny   2013-02-16 12:07:27 +08:00   ❤️ 3
    由于数据库的复杂性,以讹传讹的空间非常大,快赶上中医养生了。避免使用 NULL 的理由,在高性能MySQL里有提到一段。建议大家多读些书,少看网上的奇技淫巧。特意把书翻出来摘录了下以供参考:

    要尽量避免 NULL
    要尽可能地把字段定义为 NOT NULL。即使应用程序无须保存 NULL(没有值),也有许多表包含了可空列(Nullable Column),这仅仅是因为它为默认选项。除非真的要保存 NULL,否则就把列定义为 NOT NULL。

    MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理。当可空列被索引的时候,每条记录都需要一个额外的字节,还可能导致 MyISAM 中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引。

    即使要在表中储存「没有值」的字段,还是有可能不使用 NULL 的。考虑使用 0、特殊值或空字符串来代替它。

    把 NULL 列改为 NOT NULL 带来的性能提升很小,所以除非确定它引入了问题,否则就不要把它当作优先的优化措施。然后,如果计划对列进行索引,就要尽量避免把它设置为可空。

    [1].高性能MySQL第二版 page64
    sun1991
        3
    sun1991   2013-02-16 13:19:34 +08:00
    MySQL不知道. 如果是Oracle的话, 完全由NULL组成的列, 比如(NULL, NULL), 不包括('abc', NULL) 是被排除在普通索引之外的. 用Bitmap Index可以索引NULL值.
    m4ker
        4
    m4ker   2013-02-16 13:35:25 +08:00
    @napoleonu

    在网上搜索MYSQL优化技巧,很多文章里会有类似下面这样的段落:

    索引不应包含含有NULL值的列。

    复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的,所以我们在数据库设计时不要让字段的默认值为NULL,可以使用 特殊值、0或空字串 代替。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2973 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:09 · PVG 18:09 · LAX 03:09 · JFK 06:09
    ♥ Do have faith in what you're doing.