MySQL下limit和join的优化建议
PHP中分页肯定会使用到MySQL的limit,大部分对类似"select * from title where uid =** order by id desc limit m,n"很熟悉,也不是全部都能看出里面有什么不对,可是当是在大数据量下操作呢,比如百万类似"select * from title where uid =177 order by id desc limit 1234567,20"就会发现sql执行的时间明显变得很长,为什么呢? 先从MySQL的limit原理说起,使用limit m,n是时候,MySQL先扫描(m+n)条记录,然后从m行开始取n行.比如上面的例子就是先扫描1234587条数据,这样的话sql能快吗?这就要求我们尽可能的减少m的值,甚至没有m直接limit n这样是sql. 看个例子: mysql> select id,substr(mobile from 1 for 7),time,cpid,linkid from cp_mo100227 where cpid=769 limit 888888,10;
+----------+-----------------------------+---------------------+------+----------------------+
| id | substr(mobile from 1 for 7) | time | cpid | linkid |
+----------+-----------------------------+---------------------+------+----------------------+
| 11535090 | 1353554 | 2010-02-24 21:07:48 | 769 | 21064905903309587933 |
| 11535091 | 1353750 | 2010-02-24 21:07:48 | 769 | 21064912943389480033 |
| 11535093 | 1353394 | 2010-02-24 21:07:48 | 769 | 21064912945389480075 |
| 11535098 | 1343073 | 2010-02-24 21:07:50 | 769 | 21064905865309587977 |
| 11535100 | 1369270
相关文档:
昨天遇到一个问题:
在一张有三十万条纪录的数据表A,其主键自增字段id,name字段(varchar),还有type_id(int),在name字段上已经添加了索引。type_id由于是整型字段,认为加索引没有太多的意义,所以没有加索引。
本次有一个需求是在一个循环中按type_id查询此表A,结果一执行此循环,mySQL立刻占用CPU到200%以上,导 ......
最近遇到这么一个问题:要求删除表中重复的记录。具体来说:比如有一张用户表,用户姓名不是主键可以重复,存在这种情况,一个用户姓名被录入了好几次,如何删除重复的记录,同时要保留一条该用户录。没有具体说明保留那条记录,只要用户姓名重复的保留一条即可。
示例:
animal 表:
create table animal (
id int ,
......
MySQL语句优化的原则
1、使用索引来更快地遍历表。
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
a.有大量重复值、且经常有范围查询( > ,< ......
1. 数据库
切换数据库: use mydb
2. 事件
查看事件: show events
启动调度器: set global event_scheduer = 1;
查看是否启动: show variables like 'event_scheduler';
3. 备份
在administator中的backup中无法备份数据库的事件。需要手动将创建事件的脚本添加到sql备 ......