Dennis,
With all the changes that got me down to 4.8 seconds. Better. We are
also trying a schema in which we break up the container so it's a bit
smaller. Now my other 54 queries run sub .5 secs except 1. Which is a
variant of the one I have asked for help on. Here is the new version on
a schema based on the container table being split apart.
explain query plan SELECT a.id, a.title, a.dateAdded, a.url, a.path,
a.containerID, a.mimeType, a.width, a.height, a.genreID, a.thumbnailID,
a.releaseYearID, a.artistID, (SELECT w.title AS containerName FROM
allAlbums AS w WHERE w.id=a.containerID), (SELECT x.title AS genreName
FROM allgenres AS x WHERE x.id=a.genreID), (SELECT y.title AS
releaseYearName FROM allreleaseYears AS y WHERE y.id=a.releaseYearID),
(SELECT z.title AS artistName FROM allartists AS z WHERE
z.id=a.artistID) FROM mediaImage AS a INNER JOIN mediaAudio AS b ON
b.containerID=a.containerID WHERE b.title LIKE 'Opus%' ESCAPE '\' ORDER
BY a.title, a.id LIMIT 0,9;
0|0|TABLE mediaImage AS a WITH INDEX mediaImage_title ORDER BY
1|1|TABLE mediaAudio AS b WITH INDEX mediaAudio_containerID
0|0|TABLE allAlbums AS w USING PRIMARY KEY
0|0|TABLE allgenres AS x USING PRIMARY KEY
0|0|TABLE allreleaseYears AS y USING PRIMARY KEY
0|0|TABLE allartists AS z USING PRIMARY KEY
This runs in about 2.9 seconds. Still way slower than needed. I am
really debating whether this can be sped up to meet the < 1 second goal.
Here is the schema for the alternate layout:
CREATE TABLE "allAlbums" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "allArtists" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "allGenres" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "allPlaylists" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "allReleaseYears" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "allTags" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "container" (
-- fundamental container information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
-- enumerations
-- 10: music album
-- 11: music artist
-- 12: music genre
-- 13: music composer
-- 14: music conductor
-- 15: release year
-- 16: photo roll
-- 17: photo album / slide show
-- 18: events
-- 19: keyword
-- 20: people
-- 21: places
-- 22: user-defined tag
-- 23: playlist
-- 24: video season
-- 25: video series
-- 26: channel
-- 27: director
-- 28: actor
-- 29: producer
-- 30: audio series
-- 31: media folder
"type" INTEGER NOT NULL,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
"dateCreated" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- generic information about the media container
"ownerID" INTEGER DEFAULT NULL REFERENCES
"user(userid)",
"details" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"detailsURI" TEXT DEFAULT NULL,-- lyrics, plot, etc.
-- non-NULL only for slideshows and playlists
"duration" INTEGER UNSIGNED
DEFAULT NULL,-- in seconds
"transition" tinyint DEFAULT '0', -- 0: no effect
-- 1: cross fade
-- 2: fade to black
-- 3: slide
-- 4: zoom
-- 5: wipe
-- 6: iris wipe
-- 7: star wipe
-- 8: vertical blind
-- 9: horizontal blind
-- 10: random
-- non-NULL only for media folders
"upnpShared" tinyint DEFAULT '0',
"parentalLocked" tinyint DEFAULT '0',
-- voting and ratings
"rating" BIGINT UNSIGNED
DEFAULT NULL,
"voteCount" INTEGER UNSIGNED
DEFAULT NULL,
"avgRating" FLOAT DEFAULT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
"locked" tinyint DEFAULT '0',
"extended" tinyint DEFAULT '0'
);
CREATE TABLE "containeraux" (
-- used for certain types of containers to ensure title/type uniqueness
"title" VARCHAR(255) NOT NULL REFERENCES "container(title)"
COLLATE NOCASE,
"type" INTEGER NOT NULL REFERENCES "container(type)"
);
CREATE TABLE "extend" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL,
"document" TEXT NOT NULL,
"contact" VARCHAR(255) NOT NULL,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "extension" (
-- fundamental extension information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"extendID" INTEGER NOT NULL REFERENCES "extend(id)",
-- exactly one of the following is non-NULL
"mediaitemID" INTEGER DEFAULT NULL REFERENCES
"mediaitem(id)",
"containerID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"keyvalue" VARCHAR(255) NOT NULL,
"valvalue" VARCHAR(255) NOT NULL,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "mediaAudio" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- remote access
"url" TEXT NOT NULL,
-- information about source
"origin" TEXT NOT NULL,
"path" TEXT NOT NULL,
"removable" tinyint DEFAULT '0',
-- identity of the containing object
"containerID" INTEGER NOT NULL REFERENCES
"container(id)",
"containerPOS" UNSIGNED INTEGER
DEFAULT NULL,
"containerDisc" UNSIGNED INTEGER
DEFAULT NULL,
-- generic information about the media item
"ownerID" INTEGER DEFAULT NULL REFERENCES
"user(userid)",
"mimeType" VARCHAR(255) NOT NULL, -- e.g., audio/mpeg
"size" BIGINT UNSIGNED
NOT NULL,
"details" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"detailsURI" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"location" TEXT DEFAULT NULL,-- e.g., where picture
taken
"genreID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"thumbnailID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"thumb320ID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"releaseYearID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
-- non-NULL only for audio/video media items
"duration" INTEGER UNSIGNED
DEFAULT NULL,-- in seconds
-- non-NULL only for audio media items
"artistID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"bitRate" INTEGER UNSIGNED
DEFAULT NULL,
"sampleRate" INTEGER UNSIGNED
DEFAULT NULL,
"channels" INTEGER UNSIGNED
DEFAULT NULL,
"vbr" tinyint DEFAULT NULL,
"albumGain" tinyint DEFAULT NULL,
"albumType" VARCHAR(255) DEFAULT NULL,
"band" VARCHAR(255) DEFAULT NULL,
"bitDepth" INTEGER UNSIGNED
DEFAULT NULL,
"beatsPerMinute" INTEGER UNSIGNED
DEFAULT NULL,
"completeAlbum" tinyint DEFAULT NULL,
"compression" VARCHAR(255) DEFAULT NULL,
"intensity" INTEGER UNSIGNED
DEFAULT NULL,
"mixAlbum" tinyint DEFAULT NULL,
"peakLevel" INTEGER UNSIGNED
DEFAULT NULL,
"replayGain" INTEGER UNSIGNED
DEFAULT NULL,
-- voting and ratings
"rating" BIGINT UNSIGNED
DEFAULT NULL,
"voteCount" INTEGER UNSIGNED
DEFAULT NULL,
"avgRating" FLOAT DEFAULT NULL,
-- ownership, rights, etc.
"copyright" TEXT DEFAULT NULL,
-- finally, housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
"locked" tinyint DEFAULT '0',
"extended" tinyint DEFAULT '0'
);
CREATE TABLE "mediaImage" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- remote access
"url" TEXT NOT NULL,
-- information about source
"origin" TEXT NOT NULL,
"path" TEXT NOT NULL,
"removable" tinyint DEFAULT '0',
-- identity of the containing object
"containerID" INTEGER NOT NULL REFERENCES
"container(id)",
"containerPOS" UNSIGNED INTEGER
DEFAULT NULL,
"containerDisc" UNSIGNED INTEGER
DEFAULT NULL,
-- generic information about the media item
"ownerID" INTEGER DEFAULT NULL REFERENCES
"user(userid)",
"mimeType" VARCHAR(255) NOT NULL, -- e.g., image/jpeg
"size" BIGINT UNSIGNED
NOT NULL,
"details" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"detailsURI" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"location" TEXT DEFAULT NULL,-- e.g., where picture
taken
"genreID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"thumbnailID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"thumb320ID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"releaseYearID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
-- non-NULL only for audio media items
-- but included here for album art
"artistID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
-- non-NULL only for image/video media items
"width" INTEGER UNSIGNED
DEFAULT NULL,
"height" INTEGER UNSIGNED
DEFAULT NULL,
"colorDepth" INTEGER UNSIGNED
DEFAULT NULL,
-- non-NULL only for image media items
"aperture" INTEGER UNSIGNED
DEFAULT NULL,
"badPixels" tinyint DEFAULT NULL,
"camera" VARCHAR(255) DEFAULT NULL,
"caption" VARCHAR(255) DEFAULT NULL,
"flash" tinyint DEFAULT NULL,
"focalLength" INTEGER UNSIGNED
DEFAULT NULL,
"isoNumber" VARCHAR(255) DEFAULT NULL,
"rotation" INTEGER UNSIGNED
DEFAULT NULL,
"shutterSpeed" INTEGER UNSIGNED
DEFAULT NULL,
-- voting and ratings
"rating" BIGINT UNSIGNED
DEFAULT NULL,
"voteCount" INTEGER UNSIGNED
DEFAULT NULL,
"avgRating" FLOAT DEFAULT NULL,
-- ownership, rights, etc.
"copyright" TEXT DEFAULT NULL,
-- finally, housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
"locked" tinyint DEFAULT '0',
"extended" tinyint DEFAULT '0'
);
CREATE TABLE "mediaVideo" (
-- fundamental information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR(255) NOT NULL COLLATE NOCASE,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- remote access
"url" TEXT NOT NULL,
-- information about source
"origin" TEXT NOT NULL,
"path" TEXT NOT NULL,
"removable" tinyint DEFAULT '0',
-- identity of the containing object
"containerID" INTEGER NOT NULL REFERENCES
"container(id)",
"containerPOS" UNSIGNED INTEGER
DEFAULT NULL,
"containerDisc" UNSIGNED INTEGER
DEFAULT NULL,
-- generic information about the media item
"ownerID" INTEGER DEFAULT NULL REFERENCES
"user(userid)",
"mimeType" VARCHAR(255) NOT NULL, -- e.g., image/jpeg
"size" BIGINT UNSIGNED
NOT NULL,
"details" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"detailsURI" TEXT DEFAULT NULL,-- lyrics, plot, etc.
"location" TEXT DEFAULT NULL,-- e.g., where picture
taken
"genreID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"thumbnailID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"thumb320ID" INTEGER DEFAULT NULL REFERENCES
"mediaImage(id)",
"releaseYearID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
-- non-NULL only for audio/video media items
"duration" INTEGER UNSIGNED
DEFAULT NULL,-- in seconds
-- non-NULL only for image/video media items
"width" INTEGER UNSIGNED
DEFAULT NULL,
"height" INTEGER UNSIGNED
DEFAULT NULL,
"colorDepth" INTEGER UNSIGNED
DEFAULT NULL,
-- non-NULL only for video media items
"mpaaRating" VARCHAR(5) DEFAULT NULL, -- one of:
-- G, PG, PG-13, NC-17,
R, or NR
-- historic: G, GP, M,
or X
"mpaaReasons" VARCHAR(7) DEFAULT NULL, -- any of:
-- V, S, L, and/or D
"program" VARCHAR(255) DEFAULT NULL,
"episode" VARCHAR(255) DEFAULT NULL,
-- voting and ratings
"rating" BIGINT UNSIGNED
DEFAULT NULL,
"voteCount" INTEGER UNSIGNED
DEFAULT NULL,
"avgRating" FLOAT DEFAULT NULL,
-- ownership, rights, etc.
"copyright" TEXT DEFAULT NULL,
-- finally, housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
"locked" tinyint DEFAULT '0',
"extended" tinyint DEFAULT '0'
);
CREATE TABLE "tag" (
-- fundamental tag information
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
-- only one of mediaitemID or containerID is non-NULL
-- containerID may be non-NULL, ONLY:
-- IF the parentID's type is "user-defined tag"
-- AND the containerID's type is not "user-defined tag"
-- OR
-- IF the parentID's type is "media folder"
-- AND the containerID's type is also "media folder"
-- OR
-- IF the parentID's type is "music artist"
-- AND the containerID's type is "music album"
"mediaitemID" INTEGER DEFAULT NULL REFERENCES
"mediaitem(id)",
"containerID" INTEGER DEFAULT NULL REFERENCES
"container(id)",
"parentID" INTEGER NOT NULL REFERENCES "container(id)",
"parentPOS" UNSIGNED INTEGER
DEFAULT NULL,
"dateAdded" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "user" (
-- this table is fully-defined elsewhere...
"userid" INTEGER PRIMARY KEY AUTOINCREMENT
-- other user-specific attributes go here...
);
CREATE TABLE "usercontainer" (
-- fundamental usercontainer information
"containerID" INTEGER NOT NULL REFERENCES "container(id)",
"userID" INTEGER NOT NULL REFERENCES "user(userid)",
-- user-specific container information
"notes" TEXT DEFAULT NULL,-- user-supplied
"comments" TEXT DEFAULT NULL,
"dateLastPlayed" TIMESTAMP DEFAULT NULL,
"lastPlayedPosition" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"playCount" INTEGER UNSIGNED
DEFAULT NULL,
"dateLastSkipped" TIMESTAMP DEFAULT NULL,
"skipCount" INTEGER UNSIGNED
DEFAULT NULL,
"rating" INTEGER DEFAULT NULL, -- range: 1..5
-- bookmark information
"parentPOS" UNSIGNED INTEGER -- identifies position of
media
DEFAULT NULL,-- item having bookmark
"bookmark" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"useBookmark" tinyint DEFAULT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "usermediaAudio" (
-- fundamental information
"mediaAudioID" INTEGER NOT NULL REFERENCES "mediaAudio(id)",
"userID" INTEGER NOT NULL REFERENCES "user(userid)",
-- user-specific media item information
"notes" TEXT DEFAULT NULL,-- user-supplied
"comments" TEXT DEFAULT NULL,
"dateLastPlayed" TIMESTAMP DEFAULT NULL,
"lastPlayedPosition" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"playCount" INTEGER UNSIGNED
DEFAULT NULL,
"dateLastSkipped" TIMESTAMP DEFAULT NULL,
"skipCount" INTEGER UNSIGNED
DEFAULT NULL,
"rating" INTEGER DEFAULT NULL, -- range: 1..5
-- non-NULL only for audio/video media items
"bookmark" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"useBookmark" tinyint DEFAULT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "usermediaImage" (
-- fundamental information
"mediaImageID" INTEGER NOT NULL REFERENCES "mediaImage(id)",
"userID" INTEGER NOT NULL REFERENCES "user(userid)",
-- user-specific media item information
"notes" TEXT DEFAULT NULL,-- user-supplied
"comments" TEXT DEFAULT NULL,
"dateLastPlayed" TIMESTAMP DEFAULT NULL,
"lastPlayedPosition" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"playCount" INTEGER UNSIGNED
DEFAULT NULL,
"dateLastSkipped" TIMESTAMP DEFAULT NULL,
"skipCount" INTEGER UNSIGNED
DEFAULT NULL,
"rating" INTEGER DEFAULT NULL, -- range: 1..5
-- non-NULL only for audio/video media items
"bookmark" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"useBookmark" tinyint DEFAULT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE TABLE "usermediaVideo" (
-- fundamental information
"mediaVideoID" INTEGER NOT NULL REFERENCES "mediaVideo(id)",
"userID" INTEGER NOT NULL REFERENCES "user(userid)",
-- user-specific media item information
"notes" TEXT DEFAULT NULL,-- user-supplied
"comments" TEXT DEFAULT NULL,
"dateLastPlayed" TIMESTAMP DEFAULT NULL,
"lastPlayedPosition" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"playCount" INTEGER UNSIGNED
DEFAULT NULL,
"dateLastSkipped" TIMESTAMP DEFAULT NULL,
"skipCount" INTEGER UNSIGNED
DEFAULT NULL,
"rating" INTEGER DEFAULT NULL, -- range: 1..5
-- non-NULL only for audio/video media items
"bookmark" BIGINT UNSIGNED
DEFAULT NULL,-- in
hundredths-of-a-second
"useBookmark" tinyint DEFAULT NULL,
-- housekeeping...
"dateModified" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
NOT NULL
);
CREATE INDEX allAlbums_dateAdded ON allAlbums(dateAdded);
CREATE INDEX allAlbums_title ON allAlbums(title);
CREATE INDEX allArtists_dateAdded ON allArtists(dateAdded);
CREATE INDEX allArtists_title ON allArtists(title);
CREATE INDEX allGenres_dateAdded ON allGenres(dateAdded);
CREATE INDEX allGenres_title ON allGenres(title);
CREATE INDEX allPlaylists_title ON allPlaylists(title);
CREATE INDEX allPlaylistss_dateAdded ON allPlaylists(dateAdded);
CREATE INDEX allReleaseYears_dateAdded ON allReleaseYears(dateAdded);
CREATE INDEX allReleaseYears_titl ON allReleaseYears(title);
CREATE INDEX allTags_dateAdded ON allTags(dateAdded);
CREATE INDEX allTags_title ON allTags(title);
CREATE UNIQUE INDEX "auxid" ON containeraux(title,type);
CREATE INDEX container_avgRating ON container(avgRating);
CREATE INDEX container_dateAdded ON container(dateAdded);
CREATE INDEX container_title ON container(title);
CREATE INDEX container_type ON container(type);
CREATE INDEX extend_contact ON extend(contact);
CREATE INDEX extend_title ON extend(title);
CREATE INDEX extension_containerID ON extension(containerID);
CREATE INDEX extension_extendID ON extension(extendID);
CREATE INDEX extension_keyvalue ON extension(keyvalue);
CREATE INDEX extension_mediaitemID ON extension(mediaitemID);
CREATE INDEX mediaAudio_artistID ON mediaAudio(artistID);
CREATE INDEX mediaAudio_avgRating ON mediaAudio(avgRating);
CREATE INDEX mediaAudio_containerID ON mediaAudio(containerID);
CREATE INDEX mediaAudio_dateAdded ON mediaAudio(dateAdded);
CREATE INDEX mediaAudio_genreID ON mediaAudio(genreID);
CREATE INDEX mediaAudio_releaseYearID ON mediaAudio(releaseYearID);
CREATE INDEX mediaAudio_thumb320ID ON mediaAudio(thumb320ID);
CREATE INDEX mediaAudio_thumbnailID ON mediaAudio(thumbnailID);
CREATE INDEX mediaAudio_title ON mediaAudio(title);
CREATE INDEX mediaImage_artistID ON mediaImage(artistID);
CREATE INDEX mediaImage_avgRating ON mediaImage(avgRating);
CREATE INDEX mediaImage_containerID ON mediaImage(containerID);
CREATE INDEX mediaImage_dateAdded ON mediaImage(dateAdded);
CREATE INDEX mediaImage_genreID ON mediaImage(genreID);
CREATE INDEX mediaImage_releaseYearID ON mediaImage(releaseYearID);
CREATE INDEX mediaImage_thumb320ID ON mediaImage(thumb320ID);
CREATE INDEX mediaImage_thumbnailID ON mediaImage(thumbnailID);
CREATE INDEX mediaImage_title ON mediaImage(title);
CREATE INDEX mediaVideo_avgRating ON mediaVideo(avgRating);
CREATE INDEX mediaVideo_containerID ON mediaVideo(containerID);
CREATE INDEX mediaVideo_dateAdded ON mediaVideo(dateAdded);
CREATE INDEX mediaVideo_genreID ON mediaVideo(genreID);
CREATE INDEX mediaVideo_mpaaRating ON mediaVideo(mpaaRating);
CREATE INDEX mediaVideo_releaseYearID ON mediaVideo(releaseYearID);
CREATE INDEX mediaVideo_thumb320ID ON mediaVideo(thumb320ID);
CREATE INDEX mediaVideo_thumbnailID ON mediaVideo(thumbnailID);
CREATE INDEX mediaVideo_title ON mediaVideo(title);
CREATE INDEX tag_containerID ON tag(containerID);
CREATE INDEX tag_mediaitemID ON tag(mediaitemID);
CREATE INDEX tag_parentID ON tag(parentID);
CREATE UNIQUE INDEX "ucid" ON
usercontainer(containerID,userID);
CREATE INDEX usercontainer_containerID ON usercontainer(containerID);
CREATE INDEX usercontainer_userid ON usercontainer(userid);
CREATE UNIQUE INDEX "usermediaAudio_id" ON
usermediaAudio(mediaAudioID,userID);
CREATE INDEX usermediaAudio_mediaAudioID ON
usermediaAudio(mediaAudioID);
CREATE INDEX usermediaAudio_userid ON usermediaAudio(userid);
CREATE UNIQUE INDEX "usermediaImage_id" ON
usermediaImage(mediaImageID,userID);
CREATE INDEX usermediaImage_mediaImageID ON
usermediaImage(mediaImageID);
CREATE INDEX usermediaImage_userid ON usermediaImage(userid);
CREATE UNIQUE INDEX "usermediaVideo_id" ON
usermediaVideo(mediaVideoID,userID);
CREATE INDEX usermediaVideo_mediaVideoID ON
usermediaVideo(mediaVideoID);
CREATE INDEX usermediaVideo_userid ON usermediaVideo(userid);
-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Dennis Cote
Sent: Wednesday, April 09, 2008 1:17 PM
To: General Discussion of SQLite Database
Subject: Re: [sqlite] Left Join help
Andy Smith wrote:
> I have to get this down to < 1 sec. I have 50 queries that are all
> formatted similar. We have created another schema where the container
> is split into smaller tables which might help in speeding this up.
From
> what I see the Left joins are killing the speed.
>
I don't think that is your problem. You are doing a full table scan of a
large table. The last four left joins are required no matter what, but
they will be quick since they use the container primary key to get the
required record directly.
You want to use the most specific test you can to eliminate as many
records as possible early on. The problem is that your LIKE test can't
use an index as given. See http://www.sqlite.org/optoverview.html for
details. You need to make a few changes to your query to get it to use
the index on the mediaitem title for the like test.
First remove the unnecessary escape clause from the like clause. The set
the case_sensitive_like pragma on. Next drop the index mediaitem_type so
that sqlite will use the title index instead. Finally rearrange the
order of the a and b tables so the like test is applied first using the
index.
sqlite> drop index mediaitem_type;
sqlite> pragma case_sensitive_like = 1;
sqlite> explain query plan
...> SELECT
...> a.id,
...> a.title,
...> a.type,
...> a.dateAdded,
...> a.url,
...> a.path,
...> a.containerID,
...> a.mimeType,
...> a.width,
...> a.height,
...> a.genreID,
...> a.thumbnailID,
...> a.releaseYearID,
...> a.artistID,
...> w.title AS containerName,
...> x.title AS genreName,
...> y.title AS releaseYearName,
...> z.title AS artistName
...> FROM mediaitem AS b
...> LEFT JOIN mediaitem AS a ON b.containerID=a.containerID
...> LEFT JOIN container AS w ON w.id=a.containerID
...> LEFT JOIN container AS x ON x.id=a.genreID
...> LEFT JOIN container AS y ON y.id=a.releaseYearID
...> LEFT JOIN container AS z ON z.id=a.artistID
...> WHERE b.title LIKE 'Opus%' --remove the escape clause
...> AND b.type=0
...> AND a.type=1
...> ORDER BY a.title, a.id
...> LIMIT 0,9;
0|0|TABLE mediaitem AS b WITH INDEX mediaitem_title
1|1|TABLE mediaitem AS a WITH INDEX mediaitem_containerID
2|2|TABLE container AS w USING PRIMARY KEY
3|3|TABLE container AS x USING PRIMARY KEY
4|4|TABLE container AS y USING PRIMARY KEY
5|5|TABLE container AS z USING PRIMARY KEY
With these changes you will use the title index to quickly reduce the
table to only those records that match the title. For each of these
records it will check the type, then join the records with the same
containerID using that index with another check for the required type.
Finally it will select the indicated records from the container table
based on the rows selected.
HTH
Dennis Cote
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
This message is confidential to Prodea Systems, Inc unless otherwise indicated
or apparent from its nature. This message is directed to the intended recipient
only, who may be readily determined by the sender of this message and its
contents. If the reader of this message is not the intended recipient, or an
employee or agent responsible for delivering this message to the intended
recipient:(a)any dissemination or copying of this message is strictly
prohibited; and(b)immediately notify the sender by return message and destroy
any copies of this message in any form(electronic, paper or otherwise) that you
have.The delivery of this message and its information is neither intended to be
nor constitutes a disclosure or waiver of any trade secrets, intellectual
property, attorney work product, or attorney-client communications. The
authority of the individual sending this message to legally bind Prodea Systems
is neither apparent nor implied,and must be independently verified.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users