【问题标题】:How can I optimize this MySql table for search speed using indexes?如何使用索引优化这个 MySql 表的搜索速度?
【发布时间】:2016-10-09 10:29:40
【问题描述】:

作为一个 MySql 业余爱好者,我想请教一些关于表优化和索引使用的建议。

考虑一个包含用户发布的广告的表格。该表具有以下结构(这是一个 Laravel 实现,但我认为代码非常不言自明):

Schema::create('advertisements', function (Blueprint $table) {
        $table->increments('id');     //PRIMARY KEY AUTOINCREMENTS
        $table->text('images');       //TEXT
        $table->string('name', 150);  //VARCHAR(150)
        $table->string('slug');       //VARCHAR(255)
        $table->text('description');
        $table->string('offer_type',7)->nullable()->index();
        $table->float('price')->nullable();
        $table->string('deal_type')->nullable()->index();
        $table->char('price_period',1)->nullable()->index();
        $table->float('price_per_day')->nullable();
        $table->float('deposit')->nullable();

        $table->integer('category_id')->unsigned()->index();
        $table->foreign('category_id')->references('id')->on('categories');

        $table->integer('author_id')->unsigned()->nullable();
        $table->foreign('author_id')->references('id')->on('users');

        $table->timestamps();
    });

网站上的用户可以使用多个条件搜索上表中的广告,例如:price range、offer_typeprice_perioddeal_type

如您所见,我已对 offer_typeprice_perioddeal_type 列进行了索引。据我了解,这会导致数据库为这些列中的值创建 BTREE 索引。

但是,这些值总是来自预定义的集合: 例如 - price_period 始终是以下之一:NULL, h, d, w, m, y(小时、日、周、月、年。) deal_type 列始终是 offerdemand

问题: 如果我有一组列只包含来自预定义的小范围值的值,那么创建一个单独的值是否更好(性能方面)表并使用外键而不是索引列? 编辑:经过进一步研究,我现在意识到,外键只是一种参考工具,而不是一种性能工具,它们也可以(并且应该)被索引.但是索引外键(一个数字)是否比索引短字符串的性能更好?

【问题讨论】:

    标签: mysql indexing database-indexes


    【解决方案1】:

    索引标志和其他低基数列通常是无用的。例如,如果表的一半具有某个标志值,则更快忽略该标志上的索引并简单地扫描整个表。

    我们确实需要查看查询来判断需要哪些索引。根据你的提示,无论如何我都会刺伤......

    “例如:价格范围、offer_type、price_period 或 deal_type”——我假设用户会给出最低和最高价格?然后让我们用price_per_day 构建一个“复合”索引结尾。他们会一直指定所有其他三列吗?每列都有一个值?如果以上所有都是肯定的,那么这个复合索引是最优的:

    INDEX(over_types, price_period, deal_type, price_per_day)
    

    (前 3 列可以是任意顺序,但应用到范围的东西必须在最后。)

    如果用户可能只包含其中一些标志,和/或可能包含多个值,那么它会变得更加混乱。观察用户的需求并根据常见查询定制额外的索引。使用此index cookbook 来帮助构建它们。

    【讨论】:

    • 感谢您的回答。可以在不填写或填写任何字段的情况下执行查询。该项目尚未投入生产 - 一个好的策略是制作一个表,我将在其中存储查询中使用的字段组合,并在一些使用后确定哪些最常用并基于此创建我的索引? (将查看食谱 - 谢谢)除此之外:搜索功能还有另一层复杂性,因为它还提供跨标题和描述的全文搜索以及邻近搜索 - 对此有一个单独的问题。
    • 请记住,如果包含MATCH,则将使用FULLTEXT 索引。
    • 查看“慢日志”和“一般日志”了解收集查询的可能方式。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2013-03-28
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多