标签: query-optimization

如何在1个单独,高效的mysql查询中执行此任务?

我有一个存储在1个表格中的电视节目列表.另一张桌子展示了流派(动作,浪漫,喜剧).

大多数节目通常都有超过1种类型,所以只有一个tv_genre列并将类型ID放在那里就不是一个选择.

我可以创建一个查找表来存储电视节目id +流派id,我可以为每个与节目相关的流派插入1行.

当我想要输出索引上的节目列表以及与电视节目相关的流派名称时,事情变得模糊.如何将3个表组合成1个有效的查询(而不是为索引上的每个项运行单独的查询,获取其类型).

就本文而言,表格如下

TV Show Table
- tv_id
- tv_name

Genre Table
- genre_id
- genre_name
Run Code Online (Sandbox Code Playgroud)

谢谢!

mysql query-optimization

1
推荐指数
1
解决办法
164
查看次数

数据库表优化连接与重复列

这更像是一种偏好,但我想知道人们认为什么是最佳选择.我有一个问题,答案和点(因为我需要跟踪哪个用户指出了这一点)

表转储

Question:
  id
  title

Answer:
  id
  question_id
  user_id
  response

Point_Answer:
  id
  answer_id
  user_id
  points
Run Code Online (Sandbox Code Playgroud)

因此,在此布局中获取Top Answer将需要复杂的连接序列.

SELECT t2.id, t2.user_id, t2.response, MAX(points)
FROM Question as t1,
  (SELECT qa.*, SUM(pa.points) as points
  FROM answer as qa, Point_Answer as pa
  WHERE qa.id = pa.answer_id
  GROUP BY qa.id) as t2
WHERE t1.id = %s AND t1.id = t2.question_id
Run Code Online (Sandbox Code Playgroud)

如果我这样改变它:

Question:
  id
  title

Answer:
  id
  question_id
  user_id
  response
  points

Point_Answer:
  id
  answer_id
  user_id
  points
Run Code Online (Sandbox Code Playgroud)

查询的负担会减轻

SELECT A.id, A.user_id, A.response, MAX(points)
FROM Question as Q, …
Run Code Online (Sandbox Code Playgroud)

sql database-design query-optimization

1
推荐指数
1
解决办法
267
查看次数

Oracle BULK FETCH和FORALL插入的性能问题

我试图尽快将记录从一个表复制到另一个表.

目前我有一个类似于此的简单光标循环:

FOR rec IN source_cursor LOOP
   INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
Run Code Online (Sandbox Code Playgroud)

我想加快它的速度,所以我正在尝试一些BULK操作(BULK FETCH,然后是FORALL插入):

这是我对批量选择/ forall插入的内容.

DECLARE 
  TYPE t__event_rows IS TABLE OF _event%ROWTYPE;
  v__event_rows t__event_rows;

  CURSOR c__events IS
    SELECT * FROM _EVENT ORDER BY MESSAGE_ID;
BEGIN
  OPEN c__events;
  LOOP
    FETCH c__events BULK COLLECT INTO v__event_rows LIMIT 10000;  -- limit to 10k to avoid out of memory

    EXIT WHEN c__events%NOTFOUND;

    FORALL i IN 1..v__event_rows.COUNT SAVE EXCEPTIONS
      INSERT INTO destinatoin
        ( col1, col2, a_sequence) 
        VALUES 
        (  v__event_rows(i).col1, …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bulkinsert query-optimization

1
推荐指数
1
解决办法
4056
查看次数

优化jQuery函数

可以优化和缩小此样本函数吗?我怎么能这样做?

$(function () {
    $("#options").change(function () {
        var message_index = $("#options").val();
        if (message_index == 0) {

            $("#display_image").show();
            $("#display_flash, #display_youtube, #display_google").hide();

        } else if (message_index == 1) {

            $("#display_flash").show();
            $("#display_image, #display_youtube, #display_google").hide();

        } else if (message_index == 2) {

            $("#display_youtube").show();
            $("#display_image, #display_flash, #display_google").hide();

        } else if (message_index == 3) {

            $("#display_google").show();
            $("#display_image, #display_flash, #display_youtube").hide();

        } else {

            $("#display_image, #display_flash, #display_youtube, #display_google").hide();

        }

    });

});
Run Code Online (Sandbox Code Playgroud)

jquery query-optimization

1
推荐指数
1
解决办法
165
查看次数

在MySQL中使用组合索引

我有一个翻译表(MySQL MyISAM)用于单词(现在是空的,但一旦插入单词就会变得很大).

  • id_word
  • lang_original(原始单词的语言)VARCHAR(2)
  • lang_target(翻译后的单词的语言)VARCHAR(2)
  • 单词(单词本身)VARCHAR(50)
  • 翻译(翻译)VARCHAR(50)

只有两种SELECT可以在该表上请求信息:

通过定义原始语言

SELECT translation FROM table WHERE lang_original='en' AND lang_target='de' AND word = 'house'
//this will return 'Haus'
Run Code Online (Sandbox Code Playgroud)

通过让脚本自动检测原始语言

SELECT lang_original,translation FROM table WHERE lang_target='de' AND word = 'house'
//this will return 'en','Haus'
Run Code Online (Sandbox Code Playgroud)

通常我会将这些字段与单独的索引:

  • id_word
  • lang_original
  • lang_target

但是,我刚刚阅读了另一个线程中的组合索引,但我仍然对如何使用它们有一些疑问.

  1. 我应该只有3个索引吗?

    • id_word(主要/自动增量)
    • 合并:lang_target + word
    • 合并:lang_original + lang_target + word
  2. 那些组合索引应该是UNIQUE还是INDEX类型?为什么?

  3. 我是否还需要为lang_original,lang_target和word设置分离的索引,尽管它们不会被自己过滤掉?

更新1 fixed =而不是LIKE

mysql sql indexing optimization query-optimization

1
推荐指数
1
解决办法
303
查看次数

是否更改SQL Server中的页面大小是处理"宽"表的最佳选择?

我的应用程序中有一个非常宽且非常高的多个表.宽度有时是10-20列,包含各种数据类型varchar/nvarchar以及char/bigint/int/decimal.我的理解是SQL中的默认页面大小是8k,但可以手动更改.此外,varchar/nvarchar列除此限制外,它们通常(始终?)移动到一个单独的位置,即一个名为Row_Overflow的进程.Evenso,MS文档指出,行溢出数据会降低性能."查询和执行其他选择操作,例如对包含行溢出数据的大型记录进行排序或连接会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的"

他们建议将大列移动到可连接的元数据表中."然后可以在异步JOIN操作中查询".

我的问题是,是否值得扩大页面大小以容纳宽列,是否还会出现其他性能问题?如果我没有这样做,而是将表分成一个或多个元数据表,并且表格在100MM记录范围内变得"大",那么加入分区表是否会远远超过好处?此外,如果SQL Server在单个核心机器上(或在SQL Azure上),我的理解是并行性被禁用,那么这也会消除移动表介绍分区的好处,因为连接将不再是异步的?您推荐的其他策略是什么?

编辑:根据下面的好评和一些额外的阅读(我本来应该做的),你不能手动改变SQL Server页面大小.另外,相关SO帖子:我们如何更改SQL Server的页面大小?.来自@ remus-rusanu的其他很棒的答案

sql sql-server query-optimization

1
推荐指数
1
解决办法
2556
查看次数

优化查询"从表A中选择*"

我在接受采访时被问到,Select * from TableA如果需要花费大量时间来执行,我可以使用这些方法来优化查询.(TableA)可以是具有大量数据的任何表.面试官没有给我任何选择,如选择几列或使用"WHERE"条款而不是他希望我为主题查询提供解决方案.

t-sql sql-server query-optimization

1
推荐指数
1
解决办法
135
查看次数

如何使用同一个表中的多个SELECT优化SQL查询?

如何优化此SQL查询?

(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '0') AS a,
(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '1') AS b,
(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '2') AS c
Run Code Online (Sandbox Code Playgroud)

mysql sql query-optimization

1
推荐指数
1
解决办法
116
查看次数

查询数据库时提高页面速度

我正在使用Flask进行我正在使用的一个应用程序,以及用于存储数据的sqlalchemy和MySQL数据库.Jinja2用于模板化.在开发过程中,一切都很好,但是现在当使用更大的数据集时,我对包含大量数据的一些网页的呈现速度非常慢.例如,此代码处理用户列表:

def users():
    q = Users.query.all()
    out = []
    for i in q: 
        try:
            something_i_need = Table.query.filter_by(email=i.email).order_by(Table.date).first().id
        except:
            something_i_need = 0
        out.append({
                'id': i.id,
                'last_name': i.last_name,
                'first_name': i.first_name,
                'middle_name': i.middle_name,
                'phone': i.phone,
                'team': i.team,
                'status': i.status,
                'needed': something_i_need,
                'some_more_data': i.some_more_data
            })
    return render_template('users.html', list_of_users=out)
Run Code Online (Sandbox Code Playgroud)

数据有点简化,因为列表中有更多字段.对此位置的调用(一次查询大约2000个用户)需要10秒以上,然后页面的负载也需要10-20.该表由以下主题函数包装,来自此链接的第一个表,虽然在某些列上禁用排序功能有帮助,但它仍然非常慢.

所以,我想知道,我如何优化此过程或生成模板以使其更快?我在Amazon EC2实例上运行它Python 2.7.3 and mod_wsgi, Flask 0.9, Flask-SQLAlchemy=0.16, Jinja2==2.7, MySQL-python=1.2.4, SQLAlchemy=0.8.1.一个"明显"的解决方案,一次分页并返回100个左右的记录将真正起作用,因为列表必须包含所有用户以进行排序(主要是日期),因此该解决方案将是最后的手段.

提前致谢!

mysql query-optimization jinja2 flask flask-sqlalchemy

1
推荐指数
1
解决办法
689
查看次数

避免SQL SELECT查询中的冗余代码

我想避免我的查询有一些冗余的代码.这是一个非常简单的id-like做的例子:

SELECT 
   p.id,
   p.NOM,
   CONCAT(p.NANE,'_2') AS CLONE ,
   (SELECT id FROM person WHERE NAME = CONCAT(p.NOM,'_2')  )

FROM person p
Run Code Online (Sandbox Code Playgroud)

我有2次相同的代码:

CONCAT(PERSON.NAME,'_CLONE')
Run Code Online (Sandbox Code Playgroud)

它不容易维护(上面的代码只是我正在尝试做的一个简单的例子).

是否有解决方案可以获得相同的结果(在MySQL中运行(使用v14.14测试)):

SELECT 
  p.id,
  p.name,
  CONCAT(p.name,'_clone') as CLONE ,
  (SELECT ID FROM person WHERE name = CLONE) AS CLONE_ID

FROM person p
Run Code Online (Sandbox Code Playgroud)

此代码不适用于Oracle 11.2.0.2.0我是oracle的新手,所以我不知道上面的MySQL SQL代码的翻译是什么:s

你能帮我找一个好的写作方式吗?

sql oracle query-optimization

1
推荐指数
1
解决办法
507
查看次数