CREATE TABLE `typecho_album` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` text,
`mime` varchar(32) default NULL,
`pixel` text,
`size` int(12) unsigned default '0',
`created` int(10) unsigned default '0',
`description` text,
`url` text,
`thumb` text,
`public` int(1) unsigned default '1',
`from` varchar(32) default NULL,
`category` varchar(32) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=%charset%;
这样一个表 要建立一个索引
看了不少 还是迷糊 看看大家的说法
检索方式
select * from table
可能存在的条件
where public = 1 (pubilc 只有 0 和 1 二个值)
where from = xxx (from 有3个值)
where category = xx (category 有1-N 个值 不确定)
where created < xx and created > xx ( 这个是重点 created 是创建时间,通过时间范围检索,比如 一天,一星期, 一个月,一年)
以上条件 可能都存在 可能都不存在 也可能其中1个或者多个
谢谢!
from 和 public 基数太小, 建了索引也未必能用得上。
MySQL通过分析每条索引内部数据分布的统计信息去确定使用哪个索引(是否使用索引)。某一列的所有唯一数据数据被称为基数,这个值越大,也就说明该列中唯一值的数量越多,那么越有可能在选用这个索引时以更少的读操作中找到需要的记录。知道索引中唯一值的数目意义很有限,重要的是将这个数值和索引中的总行数做比较。MySQL衡量索引可用度高低的指标叫做选择性:cardinality/selectivity(基数/字段总数)。理想情况下,选择性值为1,且每一个值都是一个非空唯一值。一个有着优秀选择性的索引意味着有更少的相同值的行。当某一列中仅仅有少数不同的值的时候就会有较差的选择性,例如性别或者状态列。我就遇到过性别的字段数据量很大,仍然使用全表扫描,因为数据库认为此事用索引效率更低。一种说法是可用度低于40%将弃用索引,我没有印证过真伪。
你可以给 category 和 created 创建联合索引, 并在PHP逻辑中处理成, 无论用户传入什么样的条件(无论是WHERE from AND public AND category 还是 没有 WHERE), 都处理成 category 和 created 联合索引可以使用到的方方式,即:
SELECT * FROM
table
WHEREcategory
= "{$category}" ANDcreated
> "{$time}";如果有from 和 public, 加在后面,确保使用创建的索引。
如果没有from 和 public , 且category 和 created 中只有一个, 确保另一个得到补齐,另一个随便指定成NOT NULL或长度>0。
你也可以按照别人的说法,但我这种方式是索引命中率最高的。