GVKun编程网logo

Mysql 系列(五)—— 分页查询及问题优化(mysql分页查询是怎么写的)

6

对于Mysql系列感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解五——分页查询及问题优化,并且为您提供关于Can''tconnecttolocalMySQLserverthroughsoc

对于Mysql 系列感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解五—— 分页查询及问题优化,并且为您提供关于Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)、Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''、CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?的宝贵知识。

本文目录一览:

Mysql 系列(五)—— 分页查询及问题优化(mysql分页查询是怎么写的)

Mysql 系列(五)—— 分页查询及问题优化(mysql分页查询是怎么写的)

### 一。用法

在 Mysql 中分页查询使用关键字 limit。limit 的语法如下:

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

limit 关键字带有两个参数,第一个参数表示相对于第一行的偏移量,第二个参数表示检索出的最大行数。初始化行数的偏移量是 0 而非 1。

同行分页中会根据页码和每页条数计算出 limit 的偏移量即第一个参数,每页大小即第二个参数,开完成分页查询。

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

如果只有一个参数,表示从偏移量 0 处开始,返回 5 行,即:

SELECT * FROM tbl LIMIT 0, 5; # Retrieve first 5 rows

**limit 工作原理:** 如以上的 limit 5,10,mysql 会从偏移量 0 开始查询出 15 条,舍弃前面的 5 条,返回后面的 10 条。所以 limit 的工作方式是,查询出(偏移量 + 返回条数)条数据,然后舍弃前面的返回后面的所需条数。

### 二。问题

使用 limit 的过程中可能会发生的问题:

#### 问题 1. 分页查询性能问题

正如上面的 limit 的工作原理阐述,如果大数据表中 limit 分页查询或者查询指定偏移量后的数据,随着偏移量的逐渐增大,limit 的性能越来越差,甚至赶上全表扫描。比如为 1000w,那么 mysql 会将偏移的 1000w 条全部查询出来,这样就极大的影响性能。

注:limit 对于返回指定条数的性能极好,从偏移量 0 出开始,取出指定条数返回即可。

#### 问题 2. 查询结果不一致

当 order by 和 limit 同时使用时,在 order by 排序字段上,有重复字段时,会出现相同查询语句的查询结果可能不一致。

官方文档时这样描述:

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

有多行在 order by 排序字段上具有相同值,可能会按照任意顺序自由返回这些行。换句话说,这些具有相同值的行的顺序具有不确定性。

这时如果再使用 limit 分页,可能在不同页返回相同行的数据。因为那些相同值的列在每次查询的排序中具有不确定性,第 n 次排序分页查询出现,依然再下一次的排序分页查询中继续出现。

### 三。优化

####1. 分页查询性能优化

分析:

是因为分页时,随着偏移量的增大会造成将偏移量之前的数据也查询一遍导致。

解决方式:

  • 解决方式一:限制查询分页的页码,比如最多只能查询 100 页。后面的数据属于历史过久的数据,不予展示。简单粗暴,在一些特定场景中可以使用。

  • 解决方式二:上面分析了 limit 性能差的原因是因为将偏移量的之前的所有数据都查询了一遍 —— 大海捞针,那么如果能让查询从少量数据开始查询那不就 ok 了 —— 水杯捞针。既然要缩小查询范围,那么就必须过滤,既然过滤,那就必须 where。使用了 where 最好再加上索引,那就更快了。
    经过分析,现在最为关键的是 where 的条件是什么。当然最好的是属于主键了,不过这个得看应用场景。那么每次分页的时候,where 条件的值该怎么办?
    第一:可以将上次分页的结果作为下次分页的条件,这种情况时需要根据条件列进行排序,否则会出现重复结果,order by 加上 limit 又会引发上述问题,可以参照解决。建议使用不重复列 —— 主键、唯一索引列。如:where condition > condition_value order by condition limit 24;
    第二:如果 id 是连续自增不间断,可以根据页码和页数直接计算出条件,比如:where id > 20 * 24 limit 24;

  • 解决方式三:分析 limit 查询随着偏移量大时,需要查询前面的所有行,每行数据列非常多,所以导致慢。如果查询前面的行数据非常小,那是不是就快一点。基于此,可以先分页查询出主键,然后再根据主键关联,查询出所需行的全部数据。即使用子查询:select * from table id in (select id from table limit 300000, 10);
    但是这种方式也不会快很多,毕竟还是扫描了前面的全 id。

  • 解决方式四:如果只是分页查询某个列,可以使用覆盖索引。针对该列建立索引,然后分页时只扫描整个索引便能获取数据,这样就不用扫描表行,加快分页速度。

####2. 结果不一致优化

分析:

是因为 order by 对相同值的排序具有不确定性导致,如果需要结果这个,要么让 mysql 支持对于前后查询都是一样的顺序,这样就会造成查询上下文了,mysql 肯定不会这样设计。要么让排序的依据能够唯一,即排序的值是唯一的。

解决方式:

  • 解决方式一:选择具有唯一值的列进行排序

  • 解决方式二:多列值组合时唯一的情况下,选择多列上排序

#### 四.Mysql 对 limit 的优化

  • 在查询少量的行时,mysql 有时使用索引,更多情况会全表扫描;

  • 在 order by 和 limit 混合使用时,mysql 查询到排序结果中第一个 limit 的行数即结束,不会再排序所有的结果;

  • 在 distinct 和 limit 混合使用时,mysql 查询到第一个唯一的 limit 行数时即返回;

###### 参考 LIMIT Query Optimization
mysql 大数据量分页优化

Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)

Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)

ERROR 2002 (HY000): Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)

 

 

 

原因:系统盘满了

[root@localhost opt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 17G 0 100% /
tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 477M 80M 372M 18% /boot
[root@localhost opt]#

解决:

删除大文件后,重启系统解决

 

 

[root@localhost mysql]# /opt/lampp/lampp status
Version: XAMPP for Linux 1.8.3-3
Apache is not running.
MySQL is not running.
ProFTPD is running.

 

df: 未处理文件系统
[root@localhost opt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 17G 0 100% /
tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 477M 80M 372M 18% /boot
[root@localhost opt]#

 

 

[root@localhost ~]# /opt/lampp/lampp status
Version: XAMPP for Linux 1.8.3-3
Apache is not running.
MySQL is running.
ProFTPD is running.

 

 

 

xampp 无法启动mysql 找不到mysql.sock

  (2016-02-24 23:21:24)
转载
  分类: 技术
出现的问题:
如果xampp中的mysql启动不了,出现ERROR 2002 (HY000): Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)报错,
停止xampp的时候报:
-bash-4.1# /opt/lampp/lampp stop
Stopping XAMPP for Linux 1.8.2-6...
XAMPP: Stopping Apache...ok.
XAMPP: Stopping MySQL...ok.
XAMPP: Stopping ProFTPD...kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
fail.

解决办法:
如果网上一些方法不好用的话,可以试试以下方法:
1. 确定系统盘是否满了
#df -h
2. 删除/opt/lampp目录中的pid文件(删掉后xampp重启时会重建,如果不放心,可以先备份lampp目录)
删除mysql相关缓存:
#rm -rf /opt/lampp/var/mysql/VM_*  
删除proftp相关缓存:
#rm -rf /opt/lampp/var/proftpd.pid
如果找不到pid文件,可以搜一下:
#find /opt/lampp -name ''*.pid''

 

Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''

Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''

MySQL已经被我移到数据盘了,本地连接数据库会报错:Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''

但是远程是可以连接的,my.cnf设置mysql的根目录也改成了数据盘的地址,还要在加上client的参数,设置如下:

[client]
socket = /home/data/mysql/mysql.sock

之后重启下mysql就可以了

CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

亲,是不是忘记了开MysqL服务,service MysqLd start

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false

这里的

[Service]

User=mysql

Group=mysql,

user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?还是其他呢?

关于Mysql 系列五—— 分页查询及问题优化的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)、Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''、CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?的相关知识,请在本站寻找。

本文标签: