Mysql >

Mysql >,mysql,Mysql,与所有查询一样,当您的数据增长到当前大小的100-1000倍时,您的查询可能需要进行更多的优化,但现在这些应该足够了。虽然我的回答相当笼统,但我假设您使用的是MySQL 简短回答: 在测量每个步骤的绩效改进时,按照上述顺序逐一执行以下操作 在票证上添加索引。绘制和票证。状态。在系数上添加索引(主键将更好) 尽可能使用int而不是varchar 将查询转换为存储过程以保存字段调用的值,并在最大中重用这些值,而不是使用相同的值再次调用字段 将调用移动到字段的插入时间/更新时间,而不是选择时间 是的,

与所有查询一样,当您的数据增长到当前大小的100-1000倍时,您的查询可能需要进行更多的优化,但现在这些应该足够了。

虽然我的回答相当笼统,但我假设您使用的是MySQL

简短回答:
在测量每个步骤的绩效改进时,按照上述顺序逐一执行以下操作

  • 票证上添加索引。绘制
    票证。状态
    。在
    系数上添加
    索引(
    主键将更好)
  • 尽可能使用int而不是varchar
  • 查询
    转换为
    存储过程
    以保存
    字段
    调用的值,并在
    最大
    中重用这些值,而不是使用相同的值再次调用
    字段
  • 将调用移动到
    字段
    插入时间
    /
    更新时间,而不是
    选择时间
    是的,您可以通过查询更新所有行。使用
    选择
    查询并对其进行以下更改:

  • 更新
  • 之前添加
    设置t.wonmount=c.coefficient*t.uplata,t.status='2'
    ,其中…
  • (非常)长的回答:
    您的问题是讨论SQL优化的一个很好的例子,因为这里可以应用许多优化技术。让我以复杂度递增的顺序来讨论它们,这样您就可以一个接一个地实现它们,直到对结果满意为止。为了社区的利益,我还将概括每一点,同时为您提供精确的建议。让我们开始:

  • 所有
    SQL
    优化都从
    EXPLAIN
    开始。这是一种黑魔法,可以告诉你的问题出在哪里。只需在查询中的
    SELECT
    关键字之前添加
    EXPLAIN
    关键字,您就可以获得大量有关如何在幕后执行查询的信息。以下是查询的
    EXPLAIN
    输出(为了简洁起见删除了一些字段):

    每行包含查询中涉及的
    。这里要查看的两个重要字段是
    rows
    告诉为查询扫描的该表的行数。这个数字越多,需要扫描的数据就越多,因此查询速度就越慢
    告知MySQL是否正在使用任何快捷方式来减少
    。在没有任何
    键的情况下,
    MySQL
    必须扫描该
    表的所有行。因此,我们需要为
    MySQL
    提供
    (也称为
    索引
    ),以便它能够减少
    ,并快速执行查询

    • 在这里,表
      t
      (即
      tickets
      )没有使用任何
      键,因此扫描所有行(您在小提琴中提供的示例数据中有13行,实际数据中有500000行)。因此,我们将
      (或
      索引
      )添加到此查询中涉及决策的
      票证
      表的字段中。这些字段是
      draw
      status
      (…
      其中t.draw='1'和t.status='1'
      …)。
      • mysql>
        ALTER TABLE票证添加索引idx\U draw(draw)
      • mysql>
        更改表票证添加索引idx\U状态(状态)
    • 类似地,
      系数
      将受益于
      编号
      上的索引。如果
      编号
      上的
      主键
      是唯一的,则该键会更好
  • 整数数据类型(
    short
    int
    long
    等)明显快于字符数据类型(
    char
    varchar
    等)。因此,避免对整数数据使用字符数据类型。在您的数据中,
    中的所有字段都会绘制
    表,而
    票证
    表中的几乎所有字段都包含数字数据。(布尔值可以存储为<代码>字节<代码>,而不是<代码> VARCHAR < /代码>。还考虑将时间戳存储为<代码> int <代码>或<代码>长而不是<代码> VARCHAR >
  • FIELD
    是一个代价高昂的调用,尤其是在给定大量参数的情况下,因为需要做大量工作。在您的查询中,有六个不同的
    字段
    调用,每个调用在调用
    最大
    函数时重复,总共进行12次调用。考虑使用<代码>存储过程< /代码>,它允许您在变量中保存函数调用的结果,并在以后重用它们。
  • 插入期间执行验证
    /
    更新期间执行验证
    优于在
    选择期间执行验证。考虑验证您的<代码>票据。B1-B6<代码>反对<代码>绘制。1-35同时插入/更新而不是查询,并且您的代码>选择< /COD>查询将更加简单和快捷。
    最大
    的结果也可以在插入/更新时计算,并保存在
    票证
    表中的一个额外字段中,以避免在
    选择
    期间每次重新计算

  • 与所有查询一样,当您的数据增长到当前大小的100-1000倍时,您的查询可能需要进行更多的优化,但现在这些应该足够了。

    虽然我的回答相当笼统,但我假设您使用的是MySQL

    简短回答:
    在测量每个步骤的绩效改进时,按照上述顺序逐一执行以下操作

  • 票证上添加索引。绘制
    票证。状态
    。在
    系数上添加
    索引(
    主键将更好)
  • 尽可能使用int而不是varchar
  • 查询
    转换为
    存储过程
    
    CREATE TABLE IF NOT EXISTS `coefficients` (`number` int(11) DEFAULT NULL,`coefficient` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    
    
    INSERT INTO `coefficients` (`number`, `coefficient`) VALUES
    (1, 0),
    (2, 0),
    (3, 0),
    (4, 0),
    (5, 0),
    (6, 10000),
    (7, 7500),
    (8, 5000),
    (9, 2500),
    (10, 1000),
    (11, 500),
    (12, 300),
    (13, 200),
    (14, 120),
    (15, 80),
    (16, 70),
    (17, 60),
    (18, 50),
    (19, 40),
    (20, 35),
    (21, 30),
    (22, 25),
    (23, 20),
    (24, 15),
    (25, 12),
    (26, 10),
    (27, 9),
    (28, 8),
    (29, 7),
    (30, 6),
    (31, 5),
    (32, 4),
    (33, 3),
    (34, 2),
    (35, 1);
    
    
    CREATE TABLE IF NOT EXISTS `draws` (
    `iddraws` int(11) NOT NULL AUTO_INCREMENT,
    `1` varchar(255) DEFAULT NULL,
    `2` varchar(45) DEFAULT NULL,
    `3` varchar(45) DEFAULT NULL,
    `4` varchar(45) DEFAULT NULL,
    `5` varchar(45) DEFAULT NULL,
    `6` varchar(45) DEFAULT NULL,
    `7` varchar(45) DEFAULT NULL,
    `8` varchar(45) DEFAULT NULL,
    `9` varchar(45) DEFAULT NULL,
    `10` varchar(45) DEFAULT NULL,
    `11` varchar(45) DEFAULT NULL,
    `12` varchar(45) DEFAULT NULL,
    `13` varchar(45) DEFAULT NULL,
    `14` varchar(45) DEFAULT NULL,
    `15` varchar(45) DEFAULT NULL,
    `16` varchar(45) DEFAULT NULL,
    `17` varchar(45) DEFAULT NULL,
    `18` varchar(45) DEFAULT NULL,
    `19` varchar(45) DEFAULT NULL,
    `20` varchar(45) DEFAULT NULL,
    `21` varchar(45) DEFAULT NULL,
    `22` varchar(45) DEFAULT NULL,
    `23` varchar(45) DEFAULT NULL,
    `24` varchar(45) DEFAULT NULL,
    `25` varchar(45) DEFAULT NULL,
    `26` varchar(45) DEFAULT NULL,
    `27` varchar(45) DEFAULT NULL,
    `28` varchar(45) DEFAULT NULL,
    `29` varchar(45) DEFAULT NULL,
    `30` varchar(45) DEFAULT NULL,
    `31` varchar(45) DEFAULT NULL,
    `32` varchar(45) DEFAULT NULL,
    `33` varchar(45) DEFAULT NULL,
    `34` varchar(45) DEFAULT NULL,
    `35` varchar(45) DEFAULT NULL,
    `datetime` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`iddraws`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=162 ;
    
    
    INSERT INTO `draws` (`iddraws`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15`, `16`, `17`, `18`, `19`, `20`, `21`, `22`, `23`, `24`, `25`, `26`, `27`, `28`, `29`, `30`, `31`, `32`, `33`, `34`, `35`, `datetime`) VALUES
    (1, '17', '46', '27', '30', '8', '11', '4', '40', '37', '36', '22', '14', '35', '47', '24', '20', '23', '10', '2', '42', '41', '43', '9', '19', '7', '48', '3', '38', '29', '44', '16', '12', '26', '13', '5', '1391130262'),
    (2, '45', '2', '1', '24', '30', '4', '10', '11', '22', '3', '38', '33', '35', '14', '48', '28', '42', '27', '43', '9', '15', '29', '36', '41', '26', '23', '13', '5', '16', '20', '12', '6', '32', '37', '19', '1391134904'),
    (3, '12', '46', '32', '15', '14', '41', '45', '6', '9', '20', '26', '2', '47', '37', '33', '39', '34', '17', '16', '23', '35', '29', '44', '36', '18', '40', '22', '4', '27', '30', '38', '21', '3', '43', '24', '1391135221');
    
    CREATE TABLE IF NOT EXISTS `tickets` (
    `id_tiketa` int(11) NOT NULL AUTO_INCREMENT,
    `idtickets` varchar(45) DEFAULT NULL,
    `b1` varchar(45) DEFAULT NULL,
    `b2` varchar(45) DEFAULT NULL,
    `b3` varchar(45) DEFAULT NULL,
    `b4` varchar(45) DEFAULT NULL,
    `b5` varchar(45) DEFAULT NULL,
    `b6` varchar(45) DEFAULT NULL,
    `shop` varchar(45) DEFAULT NULL,
    `user` varchar(45) DEFAULT NULL,
    `time` varchar(255) DEFAULT NULL,
    `status` varchar(45) DEFAULT NULL,
    `uplata` varchar(45) DEFAULT NULL,
    `draw` varchar(45) DEFAULT NULL,
    `qt` varchar(45) DEFAULT NULL,
    `wonamount` varchar(45) DEFAULT NULL,
    PRIMARY KEY (`id_tiketa`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=138 ;
    
    
    INSERT INTO `tickets` (`id_tiketa`, `idtickets`, `b1`, `b2`, `b3`, `b4`, `b5`, `b6`, `shop`, `user`, `time`, `status`, `uplata`, `draw`, `qt`, `wonamount`) VALUES
    (75, '4-1-170-1367', '41', '47', '17', '24', '15', '44', '170', 'w1', '1391149398', '1', '1', '1', '', ''),
    (76, '4-1-170-20104', '23', '27', '13', '7', '14', '42', '170', 'w1', '1391149398', '1', '1', '1', '', ''),
    (91, '4-2-170-13887', '16', '4', '13', '35', '30', '9', '170', 'w1', '1391149462', '1', '1', '2', '', ''),
    (92, '4-2-170-9701', '2', '32', '7', '15', '5', '34', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (93, '4-2-170-45661', '23', '24', '22', '27', '48', '6', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (98, '4-2-170-45503', '36', '13', '33', '10', '29', '9', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (99, '4-2-170-24095', '19', '35', '11', '36', '46', '40', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (100, '4-2-170-42832', '27', '32', '17', '29', '7', '21', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (101, '4-2-170-13570', '22', '23', '32', '6', '1', '28', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (103, '4-2-170-28122', '15', '10', '11', '9', '14', '48', '170', 'w1', '1391149463', '1', '1', '2', '', ''),
    (116, '4-2-170-13095', '28', '20', '33', '42', '26', '14', '170', 'w1', '1391149464', '1', '1', '2', '', ''),
    (118, '4-2-170-27646', '23', '14', '37', '27', '24', '19', '170', 'w1', '1391149464', '1', '1', '2', '', ''),
    (124, '4-2-170-23302', '20', '23', '15', '38', '4', '45', '170', 'w1', '1391149465', '1', '1', '2', '', '');
    
    
    
    
    
    
    
    SELECT t.idtickets,
           t.uplata,
           c.coefficient
    FROM tickets t
    INNER JOIN draws d ON(FIELD(t.b1,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    AND (FIELD(t.b2,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    AND (FIELD(t.b3,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    AND (FIELD(t.b4,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    AND (FIELD(t.b5,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    AND (FIELD(t.b6,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35)>0)
    INNER JOIN coefficients c ON c.number = GREATEST(FIELD(t.b1,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35), FIELD(t.b2,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35), FIELD(t.b3,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35), FIELD(t.b4,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35), FIELD(t.b5,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35), FIELD(t.b6,d.1,d.2,d.3,d.4,d.5,d.6,d.7,d.8,d.9,d.10,d.11,d.12,d.13,d.14,d.15,d.16,d.17,d.18,d.19,d.20,d.21,d.22,d.23,d.24,d.25,d.26,d.27,d.28,d.29,d.30,d.31,d.32,d.33,d.34,d.35))
    WHERE t.draw='1'
      AND t.status = '1'
      AND d.iddraws='1'
    
    +-------+-------+---------------+---------+-------+------+-----------------+    
    | table | type  | possible_keys | key     | ref   | rows | Extra           |    
    +-------+-------+---------------+---------+-------+------+-----------------+    
    | d     | const | PRIMARY       | PRIMARY | const |    1 |                 |    
    | t     | ALL   | NULL          | NULL    | NULL  |   13 | Using where     |    
    | c     | ALL   | NULL          | NULL    | NULL  |   35 | Using where;... |    
    +-------+-------+---------------+---------+-------+------+-----------------+