查出的人名须要按照汉字的拼音排序,从A到Z。html
若是存储姓名的字段采用的是GBK字符集,那就好办了,由于GBK内码编码时自己就采用了拼音排序的方法(经常使用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是经常使用汉字,所以只是针对一级汉字能正确排序也够用了)。
直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序;
若是存储姓名的字段采用的是 utf8字符集,须要在排序的时候对字段进行转码;对于的代码是 order by convert(name using gbk) asc; 一样,查询的结果也是按照姓氏的升序排序;mysql
对于包含中文的字段加上”binary”属性,使之做为二进制比较,例如将”name char(10)”改为”name char(10)binary”。
若是你使用源码编译MySQL,能够编译MySQL时使用 –with–charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也能够用 extra-charsets=gb2312,gbk 来加入多个字符集。sql
若是不想对表结构进行修改或者从新编译MySQL,也能够在查询语句的 order by 部分使用 CONVERT 函数。数据库
好比 select * from mytable order by CONVERT(chineseColumnName USING gbk);
UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你须要强制让MySQL按中文来排序。性能优化
type——range/index
rows——数据查询范围
Extra——建议使用的关键字并发
http://www.javashuo.com/article/p-ymihythh-bb.html分布式
select * from orders_history where type=8 limit 100,100; select * from orders_history where type=8 limit 1000,100; select * from orders_history where type=8 limit 10000,100; select * from orders_history where type=8 limit 100000,100; select * from orders_history where type=8 limit 1000000,100;
随着查询偏移的增大,尤为查询偏移大于10万之后,查询时间急剧增长。
由于这种分页查询方式会从数据库第一条记录开始扫描,因此越日后,查询速度越慢,并且查询的数据越多,也会拖慢总查询速度。函数
select * from orders_history where type=8 and id>=(select id from orders_history where type=8 limit 100000,1) limit 100;
先定位偏移位置的 id,而后日后查询,这种方式适用于 id 递增的状况。高并发
select * from orders_history where type=2 and id between 1000000 and 1000100 limit 100;
这种方式假设数据表的id是连续递增的,则咱们根据查询的页数和查询的记录数能够算出查询的id的范围,可使用 id between and 来查询
这种查询方式可以极大地优化查询速度,基本可以在几十毫秒以内完成。限制是只能使用于明确知道id的状况,不过通常创建表的时候,都会添加基本的id字段,这为分页查询带来不少便利。性能
能够有另一种写法:
select * from orders_history where id >= 1000001 limit 100;
通常状况下,在数据库中创建表的时候,强制为每一张表添加 id 递增字段,这样方便查询。
若是像是订单库等数据量很是庞大,通常会进行分库分表。这个时候不建议使用数据库的 id 做为惟一标识,而应该使用分布式的高并发惟一 id 生成器来生成,并在数据表中使用另外的字段来存储这个惟一标识。
使用先使用范围查询定位 id (或者索引),而后再使用索引进行定位数据,可以提升好几倍查询速度。即先 select id
,而后再 select *
。
http://www.javashuo.com/article/p-qchoxqve-cc.html