MySQL服务器端分页,排序

时间:2018-11-07 18:34:39

标签: mysql performance database-performance

您好,我在数据库中有一个表,其中包含多列,超过20列,并且包含许多记录,大约200万个

该表具有一个主键:Col1,它也是我表的索引 ,由于某些原因,该列的数据类型为varchar(200)。

我正在实现服务器端的分页,排序和稍后的(过滤)

我在性能方面遇到问题,这是我的程序

keys = ['North America', 'USA']
print(my_dict.???)
    Virginia
        ['Norfolk', 'Richmond', 'Charlottesville']
    New York
        ['Albany']

keys = ['North America', 'Canada', 'Saskatchewan']
print(my_dict.???)
    ['Saskatoon']

keys = ['North America', 'Canada']
print(my_dict.???)
    Saskatchewan
        ['Saskatoon']
    New Brunswick
        ['Moncton', 'Saint John']

查询速度非常慢,并且会出现缓冲区大小问题。 如果我删除order by子句,它将变得非常快。

所以我的问题是

1-我如何增强此查询并使数百万行的排序快速进行?

2-稍后我将对多个列使用where子句应用过滤,如何避免任何性能问题?

1 个答案:

答案 0 :(得分:1)

  • ORDER BY应该被构造(concat,准备,执行,释放),而不是具有不能使用任何索引的庞大表达式。
  • 可以(但不现实)添加INDEX(col0), INDEX(col1), ...,以使准备好的语句在所有21种情况下都很快。选择重要的内容,不要将其余的内容提供给最终用户。
  • Don't use OFFSET to paginate;而是“记住您离开的地方”。
  • 过滤在哪里?可能会干扰我已经给您的提示。
  • VARCHAR(200)对于PRIMARY KEY通常是不明智的。
  • 用户能否在两列上指定排序?是否过滤日期范围?其他事情? (如果您想了解更多详细信息,请提供真实的SHOW CREATE TABLE。)
  • 您是否已“规范化”任何列?也就是说,将大的,经常重复的值移到其他表中。